C++ 中二叉樹節點的前序後繼
在這個問題中,我們給定一棵二叉樹和一個節點值。我們的任務是列印該節點的前序後繼。
二叉樹是一種特殊的樹,其中每個根節點最多可以有兩個子節點。
前序遍歷是一種遍歷樹節點的方式。在這種方式下,我們將首先遍歷根節點,然後遍歷左子節點,最後遍歷右子節點。
前序後繼節點是在節點的前序遍歷中緊跟在該節點之後的節點。
讓我們舉一個例子來理解這個問題。
Input: 9 Output 0 Explanation: the preorder traversal of the tree is: 5 9 0 1 2 5. So the preorder successor of 9 is 0.
為了解決這個問題,一種樸素的方法是找到二叉樹的前序遍歷,然後列印在給定數字之後出現的元素。
一個更有效的解決方案將涉及檢查給定數字的位置,然後根據位置搜尋其後繼。因此,如果該位置有左子節點,則前序後繼是左子節點。如果它是一個葉子節點,但它是左子節點,則其兄弟節點是前序後繼。如果它是一個葉子節點,並且不是左子節點,則我們必須向上移動到其祖先節點,其子節點將成為前序後繼。
程式將使解決方案更清晰。
示例
#include <iostream> using namespace std; struct Node { struct Node *left, *right, *parent; int key; }; Node* insertNode(int key){ Node* temp = new Node; temp->left = temp->right = temp->parent = NULL; temp->key = key; return temp; } Node* preOrderSuccessorNode(Node* root, Node* n){ if (n->left) return n->left; Node *curr = n, *parent = curr->parent; while (parent != NULL && parent->right == curr) { curr = curr->parent; parent = parent->parent; } if (parent == NULL) return NULL; return parent->right; } int main(){ Node* root = insertNode(99); root->parent = NULL; root->left = insertNode(4); root->left->parent = root; root->left->left = insertNode(18); root->left->left->parent = root->left; root->left->right = insertNode(50); root->left->right->parent = root->left; root->right = insertNode(26); root->right->parent = root; root->right->left = insertNode(5); root->right->left->parent = root->right; root->right->right = insertNode(10); root->right->right->parent = root->right; Node* preOrder = preOrderSuccessorNode(root, root->left->right); if (preOrder) { cout<<"Preorder successor of "<<root->left->right->key<<" is "<<preOrder->key; } else { cout<<"Preorder successor of "<<root->left->right->key<<" is NULL"; } return 0; }
輸出
Preorder successor of 50 is 26
廣告