数据结构与算法分析笔记与总结(java实现)--二叉树18:二叉树的下一个结点
2017-02-15 17:45
239 查看
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:注意,本题中特殊的,每个结点都有指向自己父节点的指针。
方法一:很简单,从给定的结点node开始向上遍历父节点,直到找到这棵二叉树的根结点root,然后中序遍历这棵二叉树root,每遍历一个结点都与node进行比较,看是否是node,当遇到node后,它的下一个结点就是node的后继结点。这个方法很简单但是向上遍历node之前的所有结点再进行中序遍历,麻烦,因此应该改进。
方法二:利用中序遍历时的结点之间的特点来找到下一个结点。所谓的下一个结点即后序结点是相对于中序遍历而言的,即只有在中序遍历中才有后序结点的概念。要找出一个结点的中序遍历中的下一个结点,就要挖掘在中序遍历中结点之间的关系是怎么样的,在中序遍历中已知一个结点如何和找到它的下一个节点。分析中序遍历后可以发现,对于不同的结点node,它的后序结点的求法是不同的:
情况1:如果node有右子树,那么node的后继结点就是node的右子树上最左的结点,例如结点⑥的后继结点就是⑦;
情况2:如果node没有右子树,并且它有父节点(如果node没有右子树且没有父节点那么node就是根结点并且没有右子树,于是它的后继结点就是null),并且node是父节点的左结点,那么node的父节点就是node的后继结点。例如结点⑤的后继结点就是⑥。
情况3:如果node没有右子树,并且node是父节点的右结点,例如③,那么它的后继结点比较复杂:一直向上遍历它的父节点node=node.parent,当某个结点node是它父节点的左结点时,即node=node.parent.left时,那么此时这个父节点node.parent就是node的后继结点。如果一直向上遍历node都不存在node是其父节点的左结点,即当node=node.parent等于null时还不满足,那么说明结点node是中序遍历的最后一个结点,后继结点为null。
只有以上3中情况,对输入的node进行逐一分析和处理即可。在分析问题时可以先画出一棵具有中序遍历顺序的二叉树,然后最不同结点的情况进行不同的分析即可,画图可以使得问题易于分析
/*
注意这里的结点的定义比较特殊,不要惯性思维
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
千万注意:这里父节点用next而不是parent来表示
TreeLinkNode(int val) {
this.val = val;
}
}
*/
//给出一个结点,找出这个结点在后序遍历中的下一个结点:分析可以,后继结点只可能来自3中情况
publicclass Solution {
public TreeLinkNode GetNext(TreeLinkNodepNode){
if(pNode.right!=null){
//情况1:有右子树,后继结点是右子树上的最左端结点
TreeLinkNode temp=pNode.right;
while(temp.left!=null){
temp=temp.left;
}
return temp;
}else if(pNode.next==null){
//情况2:没有右子树且pNode没有父节点,则后继结点是null
return null;
}else if(pNode==pNode.next.left){
//情况2:没有右子树且pNode有父节点且pNode是父节点的左结点,则后继结点就是父节点
return pNode.next;
}else{
//情况3:没有右子树且pNode是父节点的右子树,则后继结点是向上作为左孩子的父节点
TreeLinkNode temp=pNode;
TreeLinkNode tempParent=pNode.next;
while(tempParent!=null){
if(temp==tempParent.left)return tempParent;
temp=tempParent;
tempParent=tempParent.next;
}
//执行到此还没有返回说明没有后继结点
return null;
}
}
}
思路:注意,本题中特殊的,每个结点都有指向自己父节点的指针。
方法一:很简单,从给定的结点node开始向上遍历父节点,直到找到这棵二叉树的根结点root,然后中序遍历这棵二叉树root,每遍历一个结点都与node进行比较,看是否是node,当遇到node后,它的下一个结点就是node的后继结点。这个方法很简单但是向上遍历node之前的所有结点再进行中序遍历,麻烦,因此应该改进。
方法二:利用中序遍历时的结点之间的特点来找到下一个结点。所谓的下一个结点即后序结点是相对于中序遍历而言的,即只有在中序遍历中才有后序结点的概念。要找出一个结点的中序遍历中的下一个结点,就要挖掘在中序遍历中结点之间的关系是怎么样的,在中序遍历中已知一个结点如何和找到它的下一个节点。分析中序遍历后可以发现,对于不同的结点node,它的后序结点的求法是不同的:
情况1:如果node有右子树,那么node的后继结点就是node的右子树上最左的结点,例如结点⑥的后继结点就是⑦;
情况2:如果node没有右子树,并且它有父节点(如果node没有右子树且没有父节点那么node就是根结点并且没有右子树,于是它的后继结点就是null),并且node是父节点的左结点,那么node的父节点就是node的后继结点。例如结点⑤的后继结点就是⑥。
情况3:如果node没有右子树,并且node是父节点的右结点,例如③,那么它的后继结点比较复杂:一直向上遍历它的父节点node=node.parent,当某个结点node是它父节点的左结点时,即node=node.parent.left时,那么此时这个父节点node.parent就是node的后继结点。如果一直向上遍历node都不存在node是其父节点的左结点,即当node=node.parent等于null时还不满足,那么说明结点node是中序遍历的最后一个结点,后继结点为null。
只有以上3中情况,对输入的node进行逐一分析和处理即可。在分析问题时可以先画出一棵具有中序遍历顺序的二叉树,然后最不同结点的情况进行不同的分析即可,画图可以使得问题易于分析
/*
注意这里的结点的定义比较特殊,不要惯性思维
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
千万注意:这里父节点用next而不是parent来表示
TreeLinkNode(int val) {
this.val = val;
}
}
*/
//给出一个结点,找出这个结点在后序遍历中的下一个结点:分析可以,后继结点只可能来自3中情况
publicclass Solution {
public TreeLinkNode GetNext(TreeLinkNodepNode){
if(pNode.right!=null){
//情况1:有右子树,后继结点是右子树上的最左端结点
TreeLinkNode temp=pNode.right;
while(temp.left!=null){
temp=temp.left;
}
return temp;
}else if(pNode.next==null){
//情况2:没有右子树且pNode没有父节点,则后继结点是null
return null;
}else if(pNode==pNode.next.left){
//情况2:没有右子树且pNode有父节点且pNode是父节点的左结点,则后继结点就是父节点
return pNode.next;
}else{
//情况3:没有右子树且pNode是父节点的右子树,则后继结点是向上作为左孩子的父节点
TreeLinkNode temp=pNode;
TreeLinkNode tempParent=pNode.next;
while(tempParent!=null){
if(temp==tempParent.left)return tempParent;
temp=tempParent;
tempParent=tempParent.next;
}
//执行到此还没有返回说明没有后继结点
return null;
}
}
}
相关文章推荐
- 数据结构与算法分析笔记与总结(java实现)--二叉树21:二叉搜索树的第k个结点
- 数据结构与算法分析笔记与总结(java实现)--二叉树8:寻找错误结点练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树17:按之字形顺序打印二叉树
- 数据结构与算法分析笔记与总结(java实现)--链表8:对排序链表删除重复结点问题
- 数据结构与算法分析笔记与总结(java实现)--二叉树20:二叉搜索树的后序遍历序列
- 数据结构与算法分析笔记与总结(java实现)--二叉树11:二叉树的深度
- 数据结构与算法分析笔记与总结(java实现)--二叉树4:二叉树的序列化和反序列化练习题
- 数据结构与算法分析笔记与总结(java实现)--链表9:有序环形链表中插入新结点问题
- 数据结构与算法分析笔记与总结(java实现)--二叉树12:二叉树的镜像
- 数据结构与算法分析笔记与总结(java实现)--二叉树23:树的子结构
- 数据结构与算法分析笔记与总结(java实现)--二叉树15:对称的二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树16:从上往下打印二叉树
- 数据结构与算法分析笔记与总结(java实现)--链表14:删除链表中所有指定值结点问题
- 数据结构与算法分析笔记与总结(java实现)--链表7:含环链表找环入口结点问题
- 数据结构与算法分析笔记与总结(java实现)--链表2:倒数第k个结点问题(k从1开始)
- 数据结构与算法分析笔记与总结(java实现)--二叉树24:重建二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树22:二叉搜索树与双向链表
- 数据结构与算法分析笔记与总结(java实现)--二叉树7:折纸练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树13:平衡二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树10:最大二叉搜索子树练习题