1、二叉树的第k个结点
思路解析
由题可知这是一棵二叉搜索树
它或者是一棵空树,或者是具有下列性质的二叉树:
1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 它的左、右子树也分别为二叉搜索树。
所以,当中序遍历这棵二叉搜索树的时候,结果为升序,本题求第k个最小的结点,也就是中序遍历第k次的结点,直接返回。
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* ans;
TreeNode* kthNode(TreeNode* root, int k) {
//二叉搜索树中序遍历为有序
dfs(root, k);
return ans;
}
void dfs(TreeNode* root, int &k){
if(!root) return;
//中序遍历 每遍历一个结点就将k-1,k为0表示为第k小的结点
dfs(root -> left, k);
k --;
if(!k) ans = root;
if(k > 0) dfs(root -> right, k);
}
};
2、二叉树的深度
思路解析
利用递归思想;二叉树的深度=左右子树的最大深度+1;
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int treeDepth(TreeNode* root) {
//如果当前节点为空结点返回0 否则返回左右子树的深度最大值+1;
if(!root) return 0;
return max(treeDepth(root -> left), treeDepth(root -> right)) + 1;
}
};
3、平衡二叉树
思路解析
计算左子树深度,右子树深度;如果每一对左右子树深度之差都不大于1,则返回真,否则为假。
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool ans = true;
bool isBalanced(TreeNode* root) {
dfs(root);
return ans;
}
int dfs(TreeNode* root){
//求左子树和右子树的深度 当左右子树相差大于1 说明不是平衡二叉树 ans=false
if(!root) return 0;
int left = dfs(root -> left);
int right = dfs(root -> right);
if(abs(left - right) > 1) ans = false;
return max(left, right) + 1;
}
};
总结
今天做了几个二叉树的基础题,思路都能明白,但是细节上总会丢三落四,导致代码死循环等等,做这三个简单题复习了一下二叉搜索树、二叉平衡树的概念以及二叉树的深度递归算法,总之很有收获!希望大家喜欢。