算法学习21-在二叉树中找到一个节点的后继节点
【题目】
现在有一种新的二叉树节点类型如下:
Java结构如下
public class Node {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int data) {
this.value = data;
}
}
c++结构如下
struct Tree {
int val;
struct Tree *Left;
struct Tree *Right;
struct Tree *Next;
Tree(int x) :val(x), Left(NULL), Right(NULL), Next(NULL) {
}
};
该结构比普通二叉树节点结构多了一个指向父节点的parent指针。假 设有一 棵Node类型的节点组成的二叉树,树中每个节点的parent指针 都正确地指向 自己的父节点,头节点的parent指向null。只给一个在 二叉树中的某个节点 node,请实现返回node的后继节点的函数。在二 叉树的中序遍历的序列中, node的下一个节点叫作node的后继节点。
算法思路
其实找一个节点的后序节点及为找到他的右子树上最左的节点,如果他的右子树的节点没有的话,那么就通过他找到父节点p,若他是p的左子树,则他的后继节点为p,若他是p的右子树,则继续向上找,及找到找到他的右子树上最左的节点
代码实现
#include<iostream>
struct Tree {
int val;
struct Tree *Left;
struct Tree *Right;
struct Tree *Next;
Tree(int x) :val(x), Left(NULL), Right(NULL), Next(NULL) {
}
};
class Next
{
public:
Tree* GetNext(Tree* P)
{
if(P == NULL)
{
return P;
}
if(P->Right != NULL)
{
//后继节点就是右子树上最左的节点
//找到后可提前返回
return GetLeftMost(P->Right);
}
else
{
//通过x找到父节点p,若x是p的左子树,则x的后继节点为p,若x是p的右子树,则继续向上找
Tree* parent = P->Next;
while(P != parent->Left && parent != NULL)
{
parent = parent->Next;
P = P->Next;
}
return parent;
}
}
private:
Tree* GetLeftMost(Tree* P)
{
while(P->Left != NULL)
{
P = P->Left;
}
return P;
}
};