字节面试问到的,leetcode上没看到,记录一下自己的做法
此题近似于leetcode 236.二叉树的最近公共祖先,但有较大不同
做法为:对二叉树进行dfs遍历,递归函数写法为func dfs(root,p,q *TreeNode,ans *int) int,
其中root为当前遍历的节点,p,q为要求的两个节点,ans是答案的指针,返回int值
总体思想为利用返回值表征两个节点中的一个是否出现过,并记录距当层的高度,若根节点、左子树、右子树中的二者同时出现p,q则更新答案
分多种情况讨论:
- root==nil,遍历到空节点,返回0
- root!=nil时,分情况讨论
- 先遍历左右子节点,返回值记为left,right
- 若当前root是p,q中的一个
- 判断左右子树中是否有另一个节点(left!=0或right!=0),如果有,则直接更新答案,返回
- 否则返回1,告诉上层节点自己出现过并记录相差的高度
- root不是p,q中的一个
- 若left,right均不为0,代表左右子树都出现过p,q,则更新答案为left+right,返回
- 若均为0,则p,q不在当前树中,返回0
- 剩下的情况是left,right中有1个不为0且自己(root)不是另一个,则向上传递left+1或right+1(非0的那个+1)记录相差的高度,这样一直向上传递到p,q中另一个节点或者传到p,q的最