题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中除了左右指针还有指向双亲的一个指针。
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
typedef struct BinTreeNode{
struct BinTreeNode *pLeft;
struct BinTreeNode *pRight;
struct BinTreeNode *pParent;
int data;
}BinTreeNode;
BinTreeNode *BuyNode(int data)
{
BinTreeNode *NewNode = (BinTreeNode *)malloc(sizeof(BinTreeNode));
assert(NewNode);
NewNode->data = data;
NewNode->pLeft = NULL;
NewNode->pRight = NULL;
NewNode->pParent = NULL;
return NewNode;
}
BinTreeNode *FindNextNode(BinTreeNode *pNode)
{
if(pNode == NULL)
return NULL;
BinTreeNode *cur = pNode;
BinTreeNode *next = pNode->pRight;
BinTreeNode *parent = pNode->pParent;
if(next != NULL)
{
while(next->pLeft != NULL) //情况1
next = next->pLeft;
}
else if(parent != NULL)
{
if(parent != NULL && cur == parent->pRight)//情况2和3
{
cur = parent;
parent = parent->pParent;
}
next = parent;
}
return next;
}
void test()
{
BinTreeNode *Node1 = BuyNode(1);
BinTreeNode *Node2 = BuyNode(2);
BinTreeNode *Node3 = BuyNode(3);
BinTreeNode *Node4 = BuyNode(4);
BinTreeNode *Node5 = BuyNode(5);
BinTreeNode *Node6 = BuyNode(6);
BinTreeNode *Node7 = BuyNode(7);
BinTreeNode *Node8 = BuyNode(8);
BinTreeNode *Node9 = BuyNode(9);
Node1->pLeft = Node2;
Node1->pRight = Node3;
Node2->pLeft = Node4;
Node2->pRight = Node5;
Node3->pLeft = Node6;
Node3->pRight = Node7;
Node5->pLeft = Node8;
Node5->pRight = Node9;
Node8->pParent = Node5;
Node9->pParent = Node5;
Node5->pParent = Node2;
Node2->pParent = Node1;
Node4->pParent = Node2;
Node6->pParent = Node3;
Node7->pParent = Node3;
Node3->pParent = Node1;
BinTreeNode *NextRet = FindNextNode(Node8);
printf("Node8的下一个节点是%d\n",NextRet->data);
}
int main()
{
test();
return 0;
}