【题目】:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
【思路】:
1. 若当前结点有右子树时,其下一个结点为右子树中最左子结点;
2.若当前结点无右子树时,
(1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点;
(2)若当前结点为其父结点的右子结点时,继续向上遍历父结点的父结点,直到找到一个结点是其父结点的左子结点,该结点即为下一结点。
package com.offer.offer08;
import org.junit.Test;
/**
* @author zth
* @Date 2019-07-29 9:56
*/
public class Solution {
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
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;
}
@Test
public void test1() {
TreeLinkNode node = null;
TreeLinkNode nextNode = GetNext(node);
if(nextNode!=null)
System.out.println(nextNode.val);
else
System.out.println("无下一结点");
TreeLinkNode node1 = new TreeLinkNode(1);
TreeLinkNode node2 = new TreeLinkNode(2);
TreeLinkNode node3 = new TreeLinkNode(3);
TreeLinkNode node4 = new TreeLinkNode(4);
node1.left = node2;
node2.next = node1;
node1.right = node3;
node3.next = node1;
TreeLinkNode nextNode1 = GetNext(node1);
if(nextNode1!=null)
System.out.println(nextNode1.val);
else
System.out.println("无下一结点");
}
}