题目: 假设有一颗Node类型的节点组成的二叉树,树中每个节点的parent指针都正确地指向自己的父节点,头节点的parent指向null。只给一个在二叉树中的某个节点node,请实现返回node的后继节点的函数。在二叉树的中序遍历序列中,node的下一个节点叫做node的后继节点。
思路:
如果节点x有右孩子-》后继节点为右子树上的最左孩子;
如果节点x没有右孩子-》后继节点为不断向上查找的第一个右树 。
#include<iostream>
using namespace std;
struct Node{
int val;
Node* left;
Node* right;
Node* parent; //多了一个指向父节点的parent指针,头节点的parent指向null
Node(int val):
val(val),left(nullptr),
right(nullptr),parent(nullptr){}
};
Node* getMostLeftNode(Node* node){
if(node == nullptr)
return node;
while(node->left!=nullptr)
{
node = node->left;
}
return node;
}
Node* getSuccessorNode(Node* node){
if(node == nullptr)
{
return node;
}
if(node->right != nullptr)
{
return getMostLeftNode(node->right);
}else{
Node* parent = node->parent;
while(parent != nullptr && parent->left != node){ //当前节点是其父亲的右孩子
node = parent;
parent = node->parent;
}
return parent;
}
}
int main()
{
Node* head = new Node(6); // 6
head->parent = nullptr;
head->left = new Node(3); // 3 9
head->left->parent = head;
head->left->left = new Node(1); // 1 4 8 10
head->left->left->parent = head->left;
head->left->left->right = new Node(2); // 2 5 7
head->left->left->right->parent = head->left->left;
head->left->right = new Node(4);
head->left->right->parent = head->left;
head->left->right->right = new Node(5);
head->left->right->right->parent = head->left->right;
head->right = new Node(9);
head->right->parent = head;
head->right->left = new Node(8);
head->right->left->parent = head->right;
head->right->left->left = new Node(7);
head->right->left->left->parent = head->right->left;
head->right->right = new Node(10);
head->right->right->parent = head->right;
Node* test1 = head->left->left;
std::cout << test1->val << " next node: " << getSuccessorNode(test1)->val << std::endl;
Node* test2 = head->left->left->right;
std::cout << test2->val << " next node: " << getSuccessorNode(test2)->val << std::endl;
Node* test3 = head->right->right;
std::cout << test3->val << " next node: " << getSuccessorNode(test3)<< std::endl;
return 0;
}