剑指offer第六天之二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
java:
/*
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;
// 创建指向下一个节点的引用
TreeLinkNode pnext = null;
// 情况1:如果节点拥有右子树
if(pNode.right!=null)
{
// 创建右子树引用
TreeLinkNode pr=pNode.right;
// 查找右子树最左子节点
while(pr.left!=null)
pr=pr.left;
// 将找到的节点赋给pnext
pnext=pr;
}
else
{
// 该节点
TreeLinkNode pc=pNode;
// 此节点的父节点
TreeLinkNode pp=pNode.next;
// 情况2:没有右子树,该节点是其父节点的左子树,不进入循环,直接将其父节点,交给pnext;
// 情况3:没有右子树,并且该节点并不是其父节点的左子树,进入循环,找到一个是它父节点左子树的节点,跳出循环赋给pnext;
while(pp!=null && pc==pp.right)
{
pc=pp;
pp=pp.next;
}
pnext=pp;
}
return pnext;
}
}
python:
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode):
if pNode ==None:
return None
pnext = None
if pNode.right !=None:
pr = pNode.right
while pr.left !=None:
pr=pr.left
pnext=pr
else:
pc =pNode
pp=pNode.next
while pp!=None and pc == pp.right:
pc=pp
pp=pp.next
pnext=pp
return pnext