剑指offer系列31-----二叉树的下一个节点

【题目】给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

 1 package com.exe7.offer;
 2 
 3 /**
 4  * 【题目】给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
 5  *            注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
 6  * @author WGS
 7  *
 8  */
 9 public class GetNextNode {
10 
11     public class TreeNode{
12         int val;
13         TreeNode left=null;
14         TreeNode right=null;
15         TreeNode next=null;
16         public TreeNode(int val){
17             this.val=val;
18         }
19     }
20     
21     
22     public TreeNode getNextNode(TreeNode pNode){
23         if(pNode==null) return null;
24         //1 判断有无右子树,有就是右子树最左子节点;
25         TreeNode curNode=null;
26         if(pNode.right!=null){
27             curNode=pNode.right;
28             while(curNode.left!=null){
29                 curNode=curNode.left;
30             }
31             return curNode;
32         }
33         //2 无右子树;
34         else{
35             //1) 判断该结点是否是其父节点的左结点,是,下个结点就是其父节点。
36             if(pNode.next==null) return null;
37             if(pNode==pNode.next.left){
38                 return pNode.next;//返回其父节点
39             }
40             
41             
42             //2) 该结点不是父节点的左结点即是其右节点,则判断其父节点是否是父父结点的左结点;
43             curNode=pNode.next;//该结点的父节点
44             while(curNode.next!=null){
45                 if(curNode==curNode.next.left){
46                     return curNode.next;//返回其父节点的父节点
47                 }
48                 curNode=curNode.next;//继续回溯
49             }
50         }    
51         
52         return null;
53         
54     }
55 }
原文地址:https://www.cnblogs.com/noaman/p/5575625.html