题目
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路分析
由中序遍历特性出发——LTR,pNode节点为T,切入点是右子树
- 首先,特判当前节点为空或者是单一节点的情况 ==> return null
- 而后,判定该节点是否存在右子树
- 存在右子树(简单情况)
- 且右子树存在左子树 ==> 下一个节点是右子树的最左儿子节点
- 不存在左子树 ==> 当前右儿子就是下一个节点
- 不存在右子树
- pNode是父节点的左儿子 ==> 父节点是下一个节点
- pNode是父节点的右儿子 ==> 向上找父节点,直至找到一个“右上方”的父亲节点
- 存在右子树(简单情况)
最后收尾工作,以上四种情况都没有找到,即当前节点是最后一个节点的情况
配图方便理解
MyCode
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null || (pNode != null && pNode.left == null && pNode.right == null && pNode.next == null))
return null;
if (pNode.right != null) {
TreeLinkNode pwork = pNode.right;
if (pwork.left == null)
return pwork;
else {
do {
pwork = pwork.left;
} while (pwork.left != null);
return pwork;
}
} else {
TreeLinkNode pwork = pNode;
if (pwork.next != null && pwork.next.left == pwork)
return pwork.next;
if(pwork.next != null && pwork.next.right == pwork){
while(pwork.next != null){
if(pwork.next.right == pwork){
pwork = pwork.next;
}
else{
return pwork.next;
}
}
return null;
}
}
return null;
}
}
总结
- 从问题的性质(特性)出发,得出规律。
eg:本题中中序遍历特性——LTR ==> 从node的右子树开始分析
高中化学中讲究结构决定性质,性质决定规律,现在感悟良多。 - 思维有序,环环相扣,步步推进,东一榔头西一棒头是大忌。
- 分类讨论,高中时的技能不能忘记呀0_0
- 学不是白上的,学科间不是完全割裂的,思想上进行迁移。