【二叉树的最近公共祖先】【后序遍历】Leetcode 236. 二叉树的最近公共祖先
- 解法1 涉及到结果向上返回就要用后序遍历
- 解法2 自己写的方法 后序遍历
---------------🎈🎈236. 二叉树的最近公共祖先 题目链接🎈🎈-------------------
解法1 涉及到结果向上返回就要用后序遍历
可以稍微记一下 求二叉树的最近公共祖先,就考虑两个子节点的情况写代码就可以“以偏概全”
时间复杂度分析:
在每个节点上,都进行了常数次操作(比较和赋值),所以时间复杂度为 O(n),其中 n 是二叉树中的节点数。
空间复杂度分析:
递归调用的栈空间最大深度等于二叉树的高度,所以空间复杂度为 O(h),其中 h 是二叉树的高度
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/// 后序遍历 左右中
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root ==null) return null;if(root==p ||root==q) return root;TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left == null && right==null) return null;else if(left == null && right!=null) return right;else if(left != null && right==null) return left;else return root;}
}
解法2 自己写的方法 后序遍历
时间复杂度O(N)
空间复杂度O(N)
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 后序遍历 左右中if(root == null) return null;TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left==null && right==null) {if(root!=p && root!=q) return null;else if(root == p) return p;else return q;}else if(left==null && right!=null) {if(root !=p && root!=q){return right;}else{return root;}}else if(left!=null && right==null){if(root !=p && root!=q){return left;}else{return root;}}else{return root;} }
}