劍指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