二叉查找树,前提是二叉树,即每个节点至多只能够有两棵子树。
左子树的节点的值全部小于根节点的值,右子树的值全都大于根节点的值。那么显而易见,当中序遍历时,就是一个从小到大的有序序列。
如何查找后继,给定某个节点,确定此节点在树中的位置。如果本节点有右子树,那么它的后继节点为右子树中最左边的节点;如果本节点没有右子树,那么它的后继节点为它的祖先并且这个祖先使得本节点不为它的右子孙。查找前驱节点的思想,依此类推。
创建二叉查找树并且进行中序遍历,且找节点的后继节点的代码如下:
#include<iostream>
using namespace std;
//二叉查找树
//树的左子树均小于根节点,右子树均大于根节点
typedef struct mynode
{
int ch;
struct mynode *lchild;
struct mynode *rchild;
}*TreeNode,node;
//创建二叉查找树
void createSearchTree(TreeNode &root)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int ch;
cin>>ch;
if(root==NULL)
{
root=new node();
root->ch=ch;
root->lchild=NULL;
root->rchild=NULL;
}
else
{
TreeNode mynode=new node();
mynode->ch=ch;
mynode->lchild=NULL;
mynode->rchild=NULL;
TreeNode x,y;
x=root;
y=root;
while(x!=NULL)
{
if(x->ch>mynode->ch)
{
y=x;
x=x->lchild;
}
else
{
y=x;
x=x->rchild;
}
}
if(y->ch>mynode->ch)
{
y->lchild=mynode;
}
else
{
y->rchild=mynode;
}
}
}
cout<<"查找二叉树建立完毕!"<<endl;
}
//中序遍历,相当于排序了
void inOrder(TreeNode &root)
{
if(root!=NULL)
{
inOrder(root->lchild);
cout<<root->ch<<" ";
inOrder(root->rchild);
}
}
//找最左子节点
void findMaxLchild(TreeNode rchild)
{
TreeNode p,q;
p=rchild;
q=rchild;
while(p!=NULL)
{
q=p;
p=p->lchild;
}
cout<<"The successor node is "<<q->ch<<endl;
}
//找node的父节点
TreeNode findP(TreeNode &root,TreeNode node)
{
TreeNode p,q;
p=root;
q=root;
if(p==node)
{
return NULL;
}
while(p!=node)
{
if(p->ch>node->ch)
{
q=p;
p=p->lchild;
}
else
{
q=p;
p=p->rchild;
}
}
return q;
}
void findLeftP(TreeNode &root,TreeNode p)
{
TreeNode x,y;
y=findP(root,p);
x=p;
while(y!=NULL&&y->rchild==x)
{
x=y;
y=findP(root,y);
}
if(y==NULL)
{
cout<<"No successor node."<<endl;
}
else
{
cout<<"Successor node is "<<y->ch<<endl;
}
}
//求某个节点的后继节点
void findSuccessor(TreeNode &root,int x)
{
//首先找到此节点
TreeNode p=root;
while(p!=NULL&&p->ch!=x)
{
if(p->ch>x)
{
p=p->lchild;
}
else
{
p=p->rchild;
}
}
if(p==NULL)
{
cout<<"The node is not exits."<<endl;
return;
}
//p为指定的节点
if(p->rchild!=NULL)
{
//如果p存在右子树,那么右子树最左端的节点就是p的前驱节点
findMaxLchild(p->rchild);
}
else
{
//如果p没有右子树
findLeftP(root,p);
}
}
int main()
{
TreeNode root=NULL;
createSearchTree(root);
inOrder(root);
cout<<endl;
findSuccessor(root,17);
system("pause");
return 0;
}