算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-
目录
1.二叉树
2.搜索二叉树:
3.满二叉树:
4.平衡二叉树
1.二叉树
先、中、后序遍历
先序(中、左、右):1,2,4,5,3,6,7
中序(左、中、右):4,2,5,1,6,3,7
后序(左、右、中):4,5,2,6,7,3,1
void f(Node head)
{if(head==null){return;}f(head.left);f(head.right);}
//先序遍历(中、左、右)
void preOrderRecur(Node head)
{if(head==null){return;}cout<<head.value<<endl;preOrderRecur(head.left);preOrderRecur(head.right);
}
//中序遍历(左、中、右)
void InOrderRecur(Node head)
{if(head==null){return;} InOrderRecur(head.left);cout<<head.value<<endl;InOrderRecur(head.right);
}
//后序遍历(左、右、中)
void PosOrderRecur(Node head)
{if(head==null){return;}PosOrderRecur(head.left);PosOrderRecur(head.right);cout<<head.value<<endl;
}
1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1
先序:打印第一次遇到
中序:打印第二次遇到
后序:打印第三次遇到
void inorderunrecur(node head)
{if(head!=null)stack<node> stack= new stack<node>():node cur=head;while(!stack.isEmpty()||cur!=null){if(cur!=null){stack.push(cur); //1.进栈cur=cur.left; }else{cur= stack.pop();//2.栈中弹出cur= cur.right; //3.右子树弹出}
}
打印二叉树
二叉树的宽度优先遍历
void process(Node head)
{if(head==null){return;}Queue<Node> queue= new LinkedList<>();//创建双向链表queue.add(head);while(!queue.isEmpty()) //如果队列不为空{Node cur=queue.poll(); //弹出就打印count<<cur.value<<endl;if(cur.left!=null) //有左孩子{queue.add(cur.left);}if(cur.right!=null) //有右孩子{queue.add(cur.right);}}}void main()
{process(head);
}
怎么求一个二叉树的最大宽度
//1.构造树12 3
4 5 6 78 9 10void main(String[] args) {Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);head.right.right = new Node(7);head.left.right.right = new Node(8);head.right.left.left = new Node(9);head.right.riht.right = new Node(10);process(head);}
添加节点的层数:
void process(Node head)
{if(head==null){return;}HashMap<Node,Int> levelMap = new HashMap<>; //层数表 Queue<Node> queue= new LinkedList<>(); //创建双向链表levelMap.put(head,1);queue.add(head);int clevel=1; //当前层数int cnodes=0; //每层的个数int max=0; //最大值while(!queue.isEmpty()) {Node cur=queue.poll(); //弹出就打印int level=levelMap.get(cur)if(level==clevel){cnodes++;}else{if(cnodes>max){max=cnodes;}clevel++;cnodes=1;}count<<cur.value<<level<<endl;if(cur.left!=null) //有左孩子{levelMap.put(cur.left,level+1);queue.add(cur.left);}if(cur.right!=null) //有右孩子{levelMap.put(cur.right,level+1);queue.add(cur.right);}}cout<<clevel<<cnodes<<endl;max= Math.max(max,cnodes);return max;}
二叉树的递归套路(经典)
2.搜索二叉树:
左树节点小,右树都大。 中序遍历:左中右,依次递增,那么就是搜索二叉树。
满足条件:
1.左子树整体是搜索二叉树。
2.右子树整体是搜索二叉树。
3.左树上的最大值小于head。
4.右树上的最小值大于head。
class Node
{public:int value;Node left;Node right;Node(int data){ int value=data;}
}
//左小,右大
class Info{public:bool isBST;//是否是搜索二叉树int min; //最小值int max; //最大值
}以x为head 返回3个信息Info process(Node x)
{if(x==null)
{
}//1.遍历左右两颗树
Info leftData= process(x.left);
Info rightData=process(y.left);//2.更新左树和右树的最大最小值
int min=x.value;
int max=x.value;
if(leftData!=null){min=Math.min(min,leftData.min);max=Math.max(max,leftData.max);
}
if(rightData!=null){min=Math.min(min,rightData.min);max=Math.max(max,rightData.max);}//3.左右两边是否是搜索二叉树呢
bool isBST =false;
//左树是搜索二叉树 左树最大值小于我
//右树是搜索二叉树 右树最小值大于我
if((leftData!=null ?(leftData.isBST && leftData.max<x.value):true)&&(rightData!=null ?(rightData.isBST && rightData.min>x.value):true))
{isBST =true;
}
}bool isBSTTest(Node x)
{Info info=process(head);return info.isBST;
}
3.满二叉树:
判断条件:n=2^h-1
class Node
{public:int value;Node left;Node right;Node(int data){ int value=data;}
};
//个数和高度
class Info{public:int nodes; //个数int height; //高度Info(int n,int h){nodes=n;height=h;}};以x为head 返回3个信息
Info process(Node x)
{if(x==null){return new Info(0,0);}//遍历左右两颗树Info leftData= process(x.left);Info rightData=process(y.left);int nodes;int height;int nodes=leftInfo.nodes+rightInfo.nodes+1;int height=Math.max(leftInfo.height,rightInfo.height)+1;return new Info(nodes,height);
};bool isFull(Node head)
{Info info=process(head);int N =info.nodes;int h=info.height;//N=2^H-1return N==(1<<H)-1;
}
4.平衡二叉树
左树跟右树的高度差不超过1
class Node
{public:int value;Node left;Node right;Node(int data){ int value=data;}
};
//个数和高度
class Info{public:bool isBalanced;int height; Info(bool is,int h){isBalanced=isheight=h;}};以x为head 返回3个信息
Info process(Node x)
{if(x==null)//空树{xreturn new Info(true,0);}//遍历左右两颗树Info leftInfo= process(x.left);Info rightInfo=process(x.right);bool isBalanced;int height;height=Math.max(leftInfo.height,rightInfo.height)+1; //左树平//右树平//高度差值绝对值<2bool isBalanced=leftInfo.isBalanced && rightInfo.isBalanced &&Math.abs(leftInfo.height-rightInfo.height)<2;return new Info(isBalanced,height);
};bool isBalanced(Node head)
{Info info=process(head);return info.isBalanced;
}
算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-相关推荐
- 有苦有乐的算法 --- 用栈和递归的方式实现二叉树的前序遍历、中序遍历、后序遍历
前序遍历 递归方式: public static void pre(Node head) {if (head == null) {return;}System.out.println(head.val ...
- C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)
目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...
- java灌水bfs二叉树,二叉树的BFS搜索
本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解. 广度优先搜索算法( ...
- 【algods】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、散列表...
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...
- 学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
目录 一. 图解二叉树的深度优先搜索 二. 二叉树的广度优先搜索 (层序遍历) 三. 打开LeetCode 撸起来 至此, 咱多少被刚刚的后序非递归搞得可能有点小晕晕的, 没事,层序简单呀.... ...
- 【Java数据结构与算法】第十章 哈希表和二叉树
第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...
- 判断二叉树是否为满二叉树
1.题目 给定一棵二叉树的根节点,判断这棵二叉树是否为满二叉树. 2.分析 满二叉树:如果树的高度是 hhh,则节点数一定是 2h−12^h - 12h−1. 所以根据二叉树的递归套路:假设X为根节点 ...
- 【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】
目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7. 非-递归实现中序遍历二叉树 8. ...
- 满二叉树与完全二叉树
满二叉树与完全二叉树 满二叉树 定义 特点 完全二叉树 定义 特点 例题 满二叉树 定义 在一棵二叉树中,如果所有分支结点都有左.右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的二叉树称为满二叉 ...
最新文章
- Objective-C 自动生成文档工具:appledoc
- 攻击 FreeIPA 域:对象枚举
- 最简单java设计模式:抽象工厂模式
- Windows Azure Pack 安装部署
- 前端面试——初(H)入(T)江(M)湖(L)
- 密码学系列之:IDEA
- 斐波那契查找+思路分析
- 如何设置(样式渐变)transition
- Javascript IE 内存释放
- 微信小程序wx.request请求用POST后台得不到传递数据
- fastadmin在html中查询数据,常见问题 · fastadmin 常见问题 · 看云
- Rust : stevenbai.top学习站点
- 西电Pintos操作系统课程设计 实验三
- python输出数字三角形_蓝桥杯:数字三角的Python解决方案,三角形,之,解答
- 渗透测试-使用metasploit的evasion模块生成后门木马
- 基于讯飞语音引擎3.0.apk的Android原生TTS
- pathon中的元组与序列
- 小程序关注公众号组件
- 湖南大学计算机研究生值不值得读,一个很现实的问题:二本院校的研究生究竟值不值得去读?...
- 人人都会设计模式:07-建造者模式--Builder