剑指 Offer 55 - I. 二叉树的深度、55 - II. 平衡二叉树、64. 求1+2+…+n、68 - I. 二叉搜索树的最近公共祖先、68 - II. 二叉树的最近公共祖先
题目描述:
[55 - I]
[55 - II]
[64]
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
[68 - I]
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
[68 - II]
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
考察重点:
第55- I题 深度遍历即可。节点为nil则返回0,反之返回max(dfs(left),dfs(right))+1
第55- II题在返回节点当前深度的基础上,返回当前子树是否为平衡二叉树。这样的好处是一旦发现一棵子树不是平衡二叉树,后续无需再计算,直接返回fasle。
第64题使用函数var sum(int n) bool进行递归,将判断体写在return中。即return n > 0 && sum(n-1)。
第68- I题二叉搜索树搜索公共祖先,只需要递归判断p,q是否在root节点的左右,即是否有 p.val < root.val < q.val。
第68- II题普通二叉树搜索公共祖先,递归判断root的左右子树。
第55- I题
func max(a, b int) int{if a > b {return a}return b
}func dfs(root *TreeNode) int {if root == nil{return 0}return max(dfs(root.Left), dfs(root.Right)) + 1
}
func maxDepth(root *TreeNode) int {return dfs(root)
}
第55- II题
func max(a, b int) int{if a > b {return a}return b
}func dfs(root *TreeNode) (int, bool) {if root == nil{return 0, true}leftDep, a := dfs(root.Left)if a == false{return 1, false}rightDep, b := dfs(root.Right)if b == false || leftDep - rightDep > 1 || rightDep - leftDep > 1{return 1, false}return max(leftDep, rightDep) + 1, true
}func isBalanced(root *TreeNode) bool {_, t := dfs(root)return t
}
第64题
func sum(n int, res *int) bool{*res += n return n > 0 && sum(n-1, res)
}
func sumNums(n int) int {res := 0sum(n, &res)return res
}
第68- I题
public TreeNode dfs(TreeNode root, TreeNode p, TreeNode q){if(root.val > q.val)return dfs(root.left, p, q);if(root.val < p.val)return dfs(root.right, p, q);return root;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {TreeNode temp = p;if(p.val > q.val){p = q;q = temp;}return dfs(root, p, q);
}
第68- II题
boolean mark = true;
TreeNode res;
public boolean dfs(TreeNode root, TreeNode p, TreeNode q){if(root == null){return false;}boolean left = dfs(root.left, p, q);boolean right = dfs(root.right, p, q);if(((left && right) || ((root == p || root == q) && (left || right))) && mark == true){mark = false;res = root;return true;}if(root == p || root == q || left || right){return true;}return false;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root, p, q);return res;
}