二叉树的递归判断

看到这样一篇文章:http://blog.csdn.net/sgbfblog/article/details/7771096

我也画蛇添足总结一下。

这片文章里讲了几种方法:

一、怎样判断一个树上的节点以某种顺序(先序,后序,中序)满足条件。

二、怎样判断树上的节点以某顺序满足变化的条件。

一、

首先如果只是判断都满足条件即:f(x1)&&f(x2)……&&f(xn),以任意顺序遍历节点即可
比如先序遍历:

bool deep(node*p)
{
    if(p==NULL)return true;
    return f(p->data)&&deep(p->left)&&deep(p->right);
    return "default";
}

比如根→右→左的顺序:

bool deep(node*p)
{
    if(p==NULL)return true;
    return f(p->data)&&deep(p->right)&&deep(p->left);
    return "default";
}
这个在遍历图示上画成这样看就行:

如果这个条件比较长,比如对每个节点都要左子树的节点都小于当前节点,右子树相反,这两个条件本身对一棵树就是一个要求全部节点满足的,递归:

bool smaller(node*p,int x)
{
    if(NULL==p)return true;
    return (p->data<x)&&smaller(p->left,x)&&smaller(p->right,x);
return "default";}

bool greater(node*p,int x)
{
    if(NULL==p)return true;
    return (p->data>x)&&smaller(p->left,x)&&smaller(p->right,x);
return "default";}
这两个条件使用先序遍历的,当然这无所谓,这两个条件记为f,以后序遍历验证一个数的节点都满足f:

bool deep(node*p)
{
    if(NULL==p)return true;
    return <span>	</span>deep(p->left)&&
                deep(p->right)&&
                smaller(p->left,p->data)&&
                greater(p->right,p->data);
return true;}
这样复杂度高。

二,变化的条件无非就是递归时接受变化的参数

比如验证中序遍历一棵树的节点值是否是顺序的1,2,3……:

bool increase(node*p,int &x)
{
    if(NULL==p)return true;
    if(increase(p->left,x))
    {
        if(x++==p->data)
            return incerase(p->right,x);
        else return false;
    }
    else return false;
return true;}
再int x=1;incerese(root,x);即可,默认都返回真,这里左节点,当前,右节点的分别判断的结果之交才是当前节点的真值,所以用if else结构,写成了怪模怪样的样子。最终返回的就是所有节点对条件: (x++==p->data)的交。

再比如验证是否是排序树,只要对子节点限定范围即可:

bool deep(node*p,int a,int b)
{
    if(NULL==p)return true;
    if(p->data>=a&&p->data<=b)
    {
        deep(p->right,a,p->data);
        deep(p->left,p->data,b);
    }
    else return false;
return true;}
   ……
deep(root,INT_MIN,INT_MAX);
这里是[a,b],也可以(a,b],(a,b),都可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值