题目:
给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针外,还有一个指向父结点的指针。
思路:
如果该结点有右子树,则下一个结点就是右子孩子。
如果该结点没有右子树:
如果该结点是其父节点的左子结点,则下一个结点就是其父结点。
如果该结点是其父结点的右子结点,则向上递归,直到父结点是左子结点,则该父结点的父结点就是下一个结点。
#include <iostream>
#include <vector>
using namespace std;
struct Node{
int val;
Node *left;
Node *right;
Node *father;
Node(int _val) :val(_val), left(NULL), right(NULL), father(NULL){}
};
Node *FindNextInInorder(Node *root, Node *current)
{
if (root == NULL || current == NULL) return NULL;
if (current->right) return current->right;
while (current != NULL)
{
Node *fNode = current->father;
if (fNode == NULL) return NULL;
if (current == fNode->left) return fNode;
current = fNode;
}
return NULL;
}
int main()
{
Node *n1 = new Node(1);
Node *n2 = new Node(2);
Node *n3 = new Node(3);
Node *n4 = new Node(4);
Node *n5 = new Node(5);
Node *n6 = new Node(6);
Node *n7 = new Node(7);
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;
n3->left = n6;
n3->right = n7;
n2->father = n1;
n3->father = n1;
n4->father = n2;
n5->father = n2;
n6->father = n3;
n7->father = n3;
vector<Node *> paht1;
vector<Node *> paht2;
Node *re = FindNextInInorder(n1, n7);
if(re) cout << re->val << endl;
return 0;
}