自顶向下方法:
计算每个节点的高度,再使用先序遍历,向下递归如果遇到不平衡的子树,直接返回false,如果都遍历完成,返回true。
自底向上:
int ave(node* root){
if(!root) return 0;
int left = ave(root->left);
int right = ave(root->right);
if(abs(left-right)<=1 && left!=-1 && right!=-1){
return max(left, right) + 1;
}
else return -1;
}
- 最左下角叶子节点的值
层序遍历法:直接最后一层第一个节点就是要求的节点
(小trick:不用记录层数来统计是否是最后一层,每一层都保留,那么上一层一定会将下一层覆盖,最后返回即可)
(小trick2:通过右—》左的顺序入队,那么最后一个就是要求的点)
递归--回溯法:
和求最大深度类似。不同点在于:求深度是后序遍历,无法知道此节点是否是最左下的。
另外是否使用回溯:当需要关注具体的路线的时候,需要使用回溯,如果只是需要从整体把握,非回溯就能搞定。
而求该题需要关注具体的路线,因此要使用回溯的方法。
int maxdep = 0;
int maxval = 0;
void leftchild(TreeNode* root, int dep){
if(!root) return ;
dep++;
leftchild(root->left, dep);
leftchild(root->right, dep);
if(!root->left && !root->right && dep>maxdep){
maxdep = dep;
maxval = root->val;
return ;
}
else{
return ;
}
}