题目
二叉树的最大深度
平衡二叉树,注意是每个节点
平衡二叉树解题思路:平衡二叉树是判断每个节点的左右高度差,只要有一个不满足就返回false
从根节点开始遍历计算,首先计算根节点左右高度差并判断;
递归根节点左右所有节点计算高度差并判断;
二叉树镜像
镜像思路:不操作,递归到9,退回7找到6,交换6和9;
退回4,不操作,递归到1,退回2找到3,交换2和3
退回4,交换2和7
对称二叉树
答案
//二叉树最大深度
var maxDepth = function(root) {
//使用了 DFS,如果节点为空返回0
//当前节点不为空所以需要增加1
if(!root) return 0;
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
};
//平衡二叉树判断
var isBalanced = function(root) {
if(!root) return true;//1.树为空,是平衡 2.一直走到叶子节点发现一直平衡 这一行重要是结束当前次递归的条件
//得到最大深度
function getHight (tree){
if(!tree) return 0;
return Math.max(getHight(tree.left),getHight(tree.right)) + 1;
}
//判断高度差
if(Math.abs(getHight(root.left) - getHight(root.right)) > 1 ) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
//isBalanced(root.left) 是判断根节点左边子树是否平衡
//先把左边这一片的子树全部判断完再判断右边,这里可以简单理解为以根节点为界左右判断
};
//二叉树镜像
var mirrorTree = function (root) {
if (!root) return null;
let left = mirrorTree(root.right);
let right = mirrorTree(root.left);
root.left = left;
root.right = right;
return root;
}
//对称二叉树
var isSymmetric = function(root) {
if(!root) return true;
function compare(left,right){
if(!left && !right) return true;
else if(!left || !right) return false;
else{
return left.val === right.val && compare(left.left,right.right) && compare(left.right,right.left)
}
}
return compare(root,root);
};
//二叉搜索树的第k大节点
var kthLargest = function(root, k) {
//二叉搜索树的特点,左子树的节点的值比根节点的值小,右子树的节点值比根节点的值大
let res = 0;
function traversal(root){
//反中序遍历
if(!root) return
traversal(root.right);
k--;
if(k === 0){
res = root.val;
return
}
traversal(root.left);
}
traversal(root)
return res;
};