二叉搜索树(二叉查找树、二叉排序树)
二叉搜索树(二叉查找树、二叉排序树):
每棵子树头节点的值都比各自左子树上所有节点值要大,也都比各自右子树上所有节点值要小。二叉查找树的中序遍历序列一定是从小到大排列的。
平衡二叉查找树:
任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1
中序遍历 栈:
二叉查找树的中序遍历序列一定是从小到大排列的
c++
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
vector<int> res;
stack<TreeNode*> stk; // 栈 放遍历到的左节点
while(root!=nullptr || !stk.empty()){ // 节点为空且栈空,则已访问完最右节点
while(root != nullptr){ // 找到最左节点
stk.push(root); // 将遍历到的左节点放到栈中
root = root->left; // 遍历下一个左节点
}
root = stk.top(); // 开始回溯,此时栈顶为最左节点(该根下面没有左节点),输出该根
res.push_back(root->val);
root = root->right; // 访问该根右节点
stk.pop(); // 访问完毕,出栈
}
return res[res.size()-k];
}
};
python
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
if not root:
return 0
res= []
stack = []
while root or stack: # 栈不为空就循环
while root:
stack.append(root)
root = root.left
root = stack[-1]
res.append(root.val) # 左
root = root.right # 有右节点,下一次while就会找该右节点 最左根;没有右节点root=null,无while循环
stack.pop() # 访问完毕,出栈
return res[len(res)-k]
递归
c++
class Solution {
public:
void inorder(TreeNode* root, vector<int>& res){ // 传入向量指针 &res
if(root==NULL){ // 递归终止的条件为碰到空节点
return;
}
inorder(root->left,res); // 左中(根)右
res.push_back(root->val);
inorder(root->right,res);
}
int kthLargest(TreeNode* root, int k) {
vector<int> res;
inorder(root, res); // 子函数传入参数根节点
return res[res.size()-k];
}
};
python
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
res=[]
def inorder(root):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
inorder(root)
return res[len(res)-k]