標籤:

二叉樹的下一個節點

二叉樹的下一個節點

給定一個二叉樹和其中的一個節點,找出中序遍歷的下一個節點?

樹中的節點除了有左右孩子指針,還有指向父節點的指針

思路:

1. 如果一個節點有右子樹,那麼它的下一個節點就是它的右子樹中的最左節點

2. 如果一個節點沒有右子樹:

- 如果節點是它父節點的左孩子,那麼它的下一個節點就是它的父節點

- 如果節點是它父節點的右孩子,那麼它的下一個節點是,沿著父節點向上遍歷,父節點A是它本身父節點B的左孩子,B是下一個節點

參考代碼:

#include <iostream>using namespace std;typedef struct BTNode{ int value; BTNode* left; BTNode* right; BTNode* parent;}BTNode;BTNode* getNext(BTNode* node){ if(node == NULL) return NULL; BTNode* next = NULL; if(node->right != NULL) { BTNode* pRight = node->right; while(pRight->left != NULL) { pRight = pRight->left; } next = pRight; } else if(node->parent != NULL) { BTNode* current = node; BTNode* pParent = node->parent; while(pParent != NULL && current == pParent->right) { current = pParent; pParent = pParent->parent; } next = pParent; } if(next) cout<<next->value<<endl; return next;}BTNode* creatPreTree(int* arr,int& i,int size){ BTNode* root = NULL; if(i < size && arr[i] != #) { root = (BTNode*)malloc(sizeof(BTNode)); root->left = NULL; root->right = NULL; root->parent = NULL; root->value = arr[i]; root->left = creatPreTree(arr,++i,size); if(root->left) root->left->parent = root; root->right = creatPreTree(arr,++i,size); if(root->right) root->right->parent = root; } return root;}void printTree(BTNode* root){ if(root == NULL) return; cout<< root->value<<" "; printTree(root->left); printTree(root->right);}int main(){int i = 0;BTNode* root = NULL;int arr[]={1,2,3,#,#,4,#,#,5,6,#,#,7,#,#};root = creatPreTree(arr,i,15);printTree(root);cout<<endl;getNext(root);return 0;}

推薦閱讀:

用2個棧模擬一個隊列
期望為線性時間的選擇演算法
好好玩的螺旋演算法No.69
替換空格
雙向鏈表

TAG:演算法 | 筆試 |