二叉查找树

二叉查找树,前提是二叉树,即每个节点至多只能够有两棵子树。

左子树的节点的值全部小于根节点的值,右子树的值全都大于根节点的值。那么显而易见,当中序遍历时,就是一个从小到大的有序序列。

如何查找后继,给定某个节点,确定此节点在树中的位置。如果本节点有右子树,那么它的后继节点为右子树中最左边的节点;如果本节点没有右子树,那么它的后继节点为它的祖先并且这个祖先使得本节点不为它的右子孙。查找前驱节点的思想,依此类推。

创建二叉查找树并且进行中序遍历,且找节点的后继节点的代码如下:

#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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值