面試題8——二叉樹的下一個節點
阿新 • • 發佈:2018-11-02
題目:給定一顆二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中除了左右指標還有指向雙親的一個指標。
#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; }