二叉树的递归判断

来源:互联网 发布:ae mac破解版下载 编辑:程序博客网 时间:2024/06/15 22:42

看到这样一篇文章: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
原创粉丝点击