1. 程式人生 > >[CareerCup] 4.6 Find Next Node in a BST 尋找二叉搜尋樹中下一個節點

[CareerCup] 4.6 Find Next Node in a BST 尋找二叉搜尋樹中下一個節點

4.6 Write an algorithm to find the'next'node (i.e., in-order successor) of a given node in a binary search tree. You may assume that each node has a link to its parent.

這道題實際上考察的是一種叫線索二叉樹的資料結構,而構造這種樹的方法稱之為Morris遍歷法,在我之前的部落格Binary Tree Inorder Traversal 二叉樹的中序遍歷有詳細的介紹,然而並沒什麼卵用,因為這道題給了個條件,說每個節點都可以連結到其父節點,這樣一來就大大的簡化了問題。首先我們知道二叉搜尋樹的性質的左<=根<右,那麼其中序遍歷就是一個遞增的有序數列,那麼我們如何找到一個節點的下一個節點呢。思路是這樣的,首先我們判斷輸入節點是否為空,若為空直接返回NULL,若不為空,在看其右子節點是否存在,存在的話找到右子樹中最左的左子節點返回。如果右子節點不存在,則說明該點的子樹全遍歷完了,就要往其父節點上去找未被遍歷完全的節點,參見程式碼如下:

class Solution {
public:
    TreeNode* inorderSucc(TreeNode *n) {
        if (!n) return NULL;
        if (n->right) {
            TreeNode *p = n->right;
            while (p->left) p = p->left;
            return p;
        } else {
            TreeNode *q = n, *x = q->parent;
            
while (x && x->left != q) { q = x; x = x->parent; } return x; } } };