二叉树的下一个结
offer_57
概要:二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
- 1、有右子树的,
- 那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G)
- 2、没有右子树的,也可以分成两类,
- a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ;
- b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。
- 如果没有eg:M,那么他就是尾节点。
图片
参考
https://www.cnblogs.com/littleswan/p/12420004.html
代码实现:
/*
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) return null;//如果当前结点为空,就返回空
if(pNode.right != null){//如果当前结点的右子树不是空
pNode = pNode.right;//当前结点往当前结点的右子树的结点走一个
while(pNode.left != null){//当前结点的左结点不空
pNode = pNode.left;//当前结点往当前结点的左子树的结点走一个
}
return pNode;//返回的下一个结点就是 当前结点
}
while(pNode.next != null){//当前结点的父节点不是空
if(pNode.next.left == pNode)//如果 当前结点的 父节点的 左孩子 是 当前结点
return pNode.next;//返回的下一个结点就是当前结点的父节点
pNode = pNode.next;//往后移
}
return null;//如果是尾结点,就返回null
}
}
总结
类似于实现一个中序遍历,明白递归和非递归的区别