二叉树的递归判断
来源:互联网 发布: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
- 二叉树的递归判断
- 判断完全二叉树以及求二叉树深度的递归与非递归算法实现
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归与非递归
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归和非递归
- 二叉树的递归与非递归
- 二叉树的递归和非递归
- 二叉树的递归非递归遍历
- 二叉树的递归与非递归
- 判断排序二叉树的后序遍历是否正确(对递归算的总结)
- 递归算法练习与整理(一):判断一个二叉树是不是另一个二叉树的的子结构
- Stack(4)判断数组是不是二叉搜索树的前序遍历(递归及非递归实现)
- 二叉树的递归建立
- 二叉树的递归遍历
- android拍照容易奔溃的解决办法
- 正式生产环境下hadoop集群的DNS+NFS+ssh免密码登陆配置
- Linux中断(interrupt)子系统之一:中断系统基本原理
- 命令行查看android手机wi-fi密码
- Android虚拟键盘挡住输入组件的解决办法
- 二叉树的递归判断
- VI中的命令
- Linux中断(interrupt)子系统之二:arch相关的硬件封装层
- Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml
- UITableView和UIImageView
- Android 获取通讯录联系人
- 内存泄露检测之: Valgrind简单用法
- mfs分布式管理系统
- Oracle的导入导出(备份与恢复)