[CareerCup] 4.6 Find Next Node in a BST 尋找二叉搜尋樹中下一個節點
阿新 • • 發佈:2018-12-29
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; } } };