您的位置:首页 > Web前端

剑指offer——二叉树的下一个结点(好题)

2017-07-04 23:51 323 查看
题目描述

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

思路:

本题考查中序遍历,但给定的是其中一个节点。

由于中序遍历的顺序是左自右,所以中序遍历下节点A的下一个值,只可能是其右子树上第一个被遍历到的点,如果该节点在头结点的左子树上,还有可能是其的父节点。

(但后来发现,这样很难分析节点属于头结点右子树的情况)

所以,换思路,先不停地递归给定节点的父节点,直到找到整个树的父节点,然后再按照中序遍历,找到给定节点后,找到它的下一个节点。

public class Solution {
public TreeLinkNode result;
public boolean found = false;
public TreeLinkNode GetNext(TreeLinkNode pNode)

{
if(pNode==null)
return null;
TreeLinkNode head = pNode;
while(head.next!=null)
head = head.next;
middleSort(head,pNode);
return result;
}

public void middleSort(TreeLinkNode head,TreeLinkNode pNode){
if(head==null)
return ;
middleSort(head.left,pNode);
if(found == true){
result = head;
found = false;
return;
}
if(head==pNode)
found = true;
middleSort(head.right,pNode);
}
}


非递归求中序

import java.util.Stack;
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode==null)
return null;
TreeLinkNode root = pNode;
while(root!=null&&root.next!=null)
root = root.next;

//循环求中序遍历,找到所有找的结点
boolean find = false;
Stack<TreeLinkNode> stack = new Stack<>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();
if(find==true)
return root;
if(root==pNode)
find = true;
root = root.right;
}
}
return null;
}
}


其他思路,延续我之前最早的思路。



结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点…直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。

public class Solution {
TreeLinkNode GetNext(TreeLinkNode node)
{
if(node==null) return null;
if(node.right!=null){    //如果有右子树,则找右子树的最左节点
node = node.right;
while(node.left!=null) node = node.left;
return node;
}
while(node.next!=null){ //没右子树,则找第一个当前节点是父节点左孩子的节点
if(node.next.left==node) return node.next;
node = node.next;
}
return null;   //退到了根节点仍没找到,则返回null
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: