看到这样一篇文章: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),都可以。