力扣174. 寻找二叉搜索树中的目标节点(java,二叉搜索树的性质的运用)
Problem: LCR 174. 寻找二叉搜索树中的目标节点
文章目录
- 思路
- 解题方法即注意点
- 复杂度
- Code
思路
首先我们可以知道二叉搜索树的如下性质
1.若中序遍历先遍历左子树再右子树可以的到一个递增的序列
2.若中序遍历先遍历右子树再左子树可以的到一个递减的序列
所以我们得出如下思路:
1.以右-根-左的顺序中序递归遍历
2.在递归遍历的归的过程中记录一个递增变量,当其为第cnt大的时,结束递归返回该节点值即可。
解题方法即注意点
大体解题方法见思路,注意下点可以优化代码
当记录的递增变量大于等于cnt时,即可退出递归达到一个减枝的效果
复杂度
- 时间复杂度:
O ( n ) O(n) O(n)
- 空间复杂度:
O ( n ) O(n) O(n)
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//Time Complexity: O(n)
//Space Complexity: O(n)
int count = 0;
int result;
public int findTargetNode(TreeNode root, int cnt) {
inorder(root,cnt);
return result;
}
//二叉搜索树的中序遍历函数
//左根右:从小到大
//右根左:从大到小
public void inorder(TreeNode root, int cnt) {
//减枝:当count大于cnt时直接退出
if (count >= cnt) return;
if (root == null) return;
//先遍历右子树
inorder(root.right,cnt);
count++;
//再归的过程中查找是否存在
if (count == cnt) {
result = root.val;
return;
}
inorder(root.left,cnt);
}
}