题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右节点的指针,还有一个指向父亲节点的指针。
三种情况,1、该节点有右子树,下一个节点就是右子树的最左字节点。2、该节点没有右子树,且是父亲节点的左孩子节点,则该下一节点是其父亲节点。3、该节点没有右子树,且该节点还是父亲节点的右孩子节点,则该下一节点是沿着指向父亲节点一直向上遍历,直到找到一个是它父亲节点的左子节点的节点。
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct BinaryTreeNode{
int data;
BinaryTreeNode* left;
BinaryTreeNode* right;
BinaryTreeNode* parent;
}*TreeNode;
void getNextNode(TreeNode pNode){
TreeNode pNext = NULL;
int d = pNode->data;
if(pNode!=NULL){
if(pNode->right!=NULL){
pNode = pNode->right;
while(pNode->left!=NULL){
pNode = pNode->left;
}
pNext = pNode;
}
else if(pNode->parent!=NULL){
TreeNode pCurrent = pNode;
TreeNode pParent = pNode->parent;
while(pParent!=NULL&&pParent->right==pCurrent){
pCurrent = pParent;
pParent = pParent->parent;
}
pNext = pParent;
}
printf("%d的下一个节点是:%d\n",d,pNext->data);
}
else
printf("this node is null.\n");
}
TreeNode createTreeNode(int value){
TreeNode node = (TreeNode)malloc(sizeof(BinaryTreeNode));
node->data = value;
node->left = NULL;
node->right = NULL;
node->parent = NULL;
return node;
}
void connectTreeNode(TreeNode pParent,TreeNode pLeft,TreeNode pRight){
if(pParent!=NULL){
pParent->left = pLeft;
pParent->right = pRight;
if(pLeft!=NULL){
pLeft->parent = pParent;
}
if(pRight!=NULL){
pRight->parent = pParent;
}
}
}
void printNode(TreeNode pNode){
if(pNode!=NULL){
printf("value of this node is:%d\n",pNode->data);
if(pNode->left!=NULL)
printf("value of its left child is:%d\n",pNode->left->data);
else
printf("left child is null.\n");
if(pNode->right!=NULL)
printf("value of its right child is:%d\n",pNode->right->data);
else
printf("right child is null.\n");
}
else
printf("this node is null.\n");
printf("\n");
}
void printTree(TreeNode pRoot){
printNode(pRoot);
if(pRoot!=NULL){
if(pRoot->left!=NULL){
printTree(pRoot->left);
}
if(pRoot->right!=NULL){
printTree(pRoot->right);
}
}
}
int main(){
TreeNode pNode8 = createTreeNode(8);
TreeNode pNode6 = createTreeNode(6);
TreeNode pNode10 = createTreeNode(10);
TreeNode pNode5 = createTreeNode(5);
TreeNode pNode7 = createTreeNode(7);
TreeNode pNode9 = createTreeNode(9);
TreeNode pNode11 = createTreeNode(11);
connectTreeNode(pNode8,pNode6,pNode10);
connectTreeNode(pNode6,pNode5,pNode7);
connectTreeNode(pNode10,pNode9,pNode11);
printTree(pNode8);
getNextNode(pNode6);
getNextNode(pNode7);
return 0;
}