思路比较简单:
就是先调用minimum找到二叉树中的最小关键字的结点,即二叉树最左边的树叶,然后依然迭代地调用tree_successor寻找前一个结点x的后继:即比x->key大的所有关键字中最小的一个的节点。依次输出即可。
minimum很容易理解,利用蛮力一直往左遍历,到底即可。
tree_successor分两种情况,如果x有右子树,则x的后继就是右子树中最小关键字的那个结点,如果x没有右子树,则后继是x的最底层祖先。最底层祖先听着很拗口,用图示表示就是:13号结点的后继是15,15即为13的后继,13的祖先有15和30,而15为13的最底层祖先。
代码:
#include<iostream>
using namespace std;
struct node//结点
{
int key;
node* p;
node* left;
node* right;
node(){}
node(int k):key(k),p(NULL),left(NULL),right(NULL){}
};
struct TREE//树
{
node* root;
TREE():root(NULL){}
};
node* minimum(node* x)//一直往左遍历到最底即可
{
while(x->lef