二叉数查找指定结点

指定的节点用节点存储的数据来代表,采用递归的方法先判断当前节点是否是目标节点,若不是则依次查找左子树和右子树:

#include<iostream>  
#include<stack>  
using namespace std;  
typedef struct tr  
{  
    int data;  
    struct tr *left,*right;  
}tre,* tree;  
stack<tree>st;  
tree creat(tree root,int val)  
{  
    tree newroot;  
    if(NULL==root)  
    {  
        newroot=new tre;  
        newroot->data=val;  
        newroot->left=newroot->right=NULL;  
        return newroot;  
    }  
    if(val<=root->data)  
        root->left=creat(root->left,val);  
    else  
        root->right=creat(root->right,val);  
    return root;  
}  
void level(tree root,int val,int &ans,int lev)  
{//lev为中间变量,初始值为1,记录层数  
    if(NULL==root)  
        ans=-1;  
    else if(root->data==val)  
        ans=lev;  
    else  
    {  
        level(root->left,val,ans,lev+1);//在左子树中查找  
        if(ans==-1)  
            level(root->right,val,ans,lev+1);//在右子树中查找  
    }  
}  
/*void lbr(tree root) 
{ 
    while(NULL!=root || !st.empty()) 
    { 
        if(NULL!=root) 
        { 
            st.push(root); 
            root=root->left; 
        } 
        else 
        { 
            root=st.top(); 
            st.pop(); 
            printf("%d ",root->data); 
            root=root->right; 
        } 
    } 
} 
void blr(tree root) 
{ 
    while(NULL!=root || !st.empty()) 
    { 
        if(NULL!=root) 
        { 
            printf("%d ",root->data); 
            st.push(root); 
            root=root->left; 
        } 
        else 
        { 
            root=st.top(); 
            st.pop(); 
            root=root->right; 
        } 
    } 
}*/  
int main()  
{  
    int n;  
    int res;  
    tree tmp;  
    tmp=NULL;  
    while(scanf("%d",&n),n+1)  
        tmp=creat(tmp,n);  
    lbr(tmp);  
    printf("/n");  
    blr(tmp);  
    printf("/n");  
    while(scanf("%d",&n)!=EOF)  
    {  
        res=-1;  
        level(tmp,n,res,1);  
        printf("%d/n",res);  
    }  
    return false;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值