这里有两种情况
第一种,该节点node有右子节点,那这时他的后继节点就是他右子节点的最左节点node0
第二种,该节点node没有右子节点,那这时他的后继节点就是他的上面的一个节点node0,但node必须是node0节点的左子树点下的节点。如果没有这个节点node0,那么节点node就是这棵树的最右节点,这个节点的后继节点就是NULL。
代码
#include<iostream>
#include<vector>
using namespace std;
struct BTree{
int data;
BTree * left;
BTree * right;
BTree * parent;
};
BTree * find_successor_node(BTree * head,BTree *node1)
{
//第一种情况
if(node1->right!=NULL)
{
BTree * node_r=new BTree;
node_r=node1->right;
while(node_r->left!=NULL)
{
node_r=node_r->left;
}
return node_r;
}
//第二种情况
BTree * node_parent=new BTree;
node_parent=node1->parent;
while(node1!=head)
{
if(node_parent->left==node1)
return node_parent;
else
{
node1=node1->parent;
node_parent=node_parent->parent;
}
}
//遍历到头节点都没有找到后继节点
return NULL;
}
int main()
{
BTree * node1=new BTree;
BTree * node2=new BTree;
BTree * node3=new BTree;
node1->data=1;
node1->right=node3;
node1->left=node2;
node2->data=2;
node2->left=NULL;
node2->right=NULL;
node2->parent=node1;
node3->data=3;
node3->left=NULL;
node3->parent=node1;
BTree * result=new BTree;
result=find_successor_node(node1,node2);
cout<<result->data<<endl;
}