判断是否是完全二叉树_【数据结构】二叉树高频考试题目【代码模板】!
本文来自公众号程序员小乐(study_tech)
作者:IOExceptioner
编辑:www.jianshu.com/p/0190985635eb
先上二叉树的数据结构:
class TreeNode{ int val; //左孩子 TreeNode left; //右孩子 TreeNode right;}
二叉树的题目普遍可以用递归和迭代的方式来解
1. 求二叉树的最大深度
int maxDeath(TreeNode node){if(node==null){ return 0; }int left = maxDeath(node.left);int right = maxDeath(node.right); return Math.max(left,right) + 1;}
2. 求二叉树的最小深度
int getMinDepth(TreeNode root){if(root == null){return 0; }return getMin(root); } int getMin(TreeNode root){if(root == null){return Integer.MAX_VALUE; }if(root.left == null&&root.right == null){return 1; }return Math.min(getMin(root.left),getMin(root.right)) + 1; }
3. 求二叉树中节点的个数
int numOfTreeNode(TreeNode root){if(root == null){ return 0; }int left = numOfTreeNode(root.left);int right = numOfTreeNode(root.right); return left + right + 1; }
4. 求二叉树中叶子节点的个数
int numsOfNoChildNode(TreeNode root){if(root == null){return 0; }if(root.left==null&&root.right==null){return 1; }return numsOfNodeTreeNode(root.left)+numsOfNodeTreeNode(root.right); }
5. 求二叉树中第k层节点的个数
int numsOfkLevelTreeNode(TreeNode root,int k){if(root == null||k<1){return 0; }if(k==1){return 1; }int numsLeft = numsOfkLevelTreeNode(root.left,k-1);int numsRight = numsOfkLevelTreeNode(root.right,k-1);return numsLeft + numsRight; }
6. 判断二叉树是否是平衡二叉树
boolean isBalanced(TreeNode node){ return maxDeath2(node)!=-1; }int maxDeath2(TreeNode node){if(node == null){ return 0; }int left = maxDeath2(node.left);int right = maxDeath2(node.right);if(left==-1||right==-1||Math.abs(left-right)>1){ return -1; } return Math.max(left, right) + 1; }
7.判断二叉树是否是完全二叉树
什么是完全二叉树呢?参见
boolean isCompleteTreeNode(TreeNode root){if(root == null){ return false; } Queue queue = new LinkedList(); queue.add(root); boolean result = true; boolean hasNoChild = false;while(!queue.isEmpty()){ TreeNode current = queue.remove();if(hasNoChild){if(current.left!=null||current.right!=null){ result = false; break; } }else{if(current.left!=null&¤t.right!=null){ queue.add(current.left); queue.add(current.right); }else if(current.left!=null&¤t.right==null){ queue.add(current.left); hasNoChild = true; }else if(current.left==null&¤t.right!=null){ result = false; break; }else{ hasNoChild = true; } } } return result; }
8. 两个二叉树是否完全相同
boolean isSameTreeNode(TreeNode t1,TreeNode t2){if(t1==null&&t2==null){return true; }else if(t1==null||t2==null){return false; }if(t1.val != t2.val){return false; } boolean left = isSameTreeNode(t1.left,t2.left); boolean right = isSameTreeNode(t1.right,t2.right);return left&&right; }
9. 两个二叉树是否互为镜像
boolean isMirror(TreeNode t1,TreeNode t2){if(t1==null&&t2==null){return true; }if(t1==null||t2==null){return false; }if(t1.val != t2.val){return false; }return isMirror(t1.left,t2.right)&&isMirror(t1.right,t2.left); }
10. 翻转二叉树or镜像二叉树
TreeNode mirrorTreeNode(TreeNode root){if(root == null){ return null; } TreeNode left = mirrorTreeNode(root.left); TreeNode right = mirrorTreeNode(root.right); root.left = right; root.right = left; return root; }
11. 求两个二叉树的最低公共祖先节点
TreeNode getLastCommonParent(TreeNode root,TreeNode t1,TreeNode t2){if(findNode(root.left,t1)){if(findNode(root.right,t2)){return root; }else{return getLastCommonParent(root.left,t1,t2); } }else{if(findNode(root.left,t2)){return root; }else{return getLastCommonParent(root.right,t1,t2) } } }// 查找节点node是否在当前 二叉树中 boolean findNode(TreeNode root,TreeNode node){if(root == null || node == null){return false; }if(root == node){return true; } boolean found = findNode(root.left,node);if(!found){ found = findNode(root.right,node); }return found; }
12. 二叉树的前序遍历
迭代解法
ArrayList preOrder(TreeNode root){ Stack stack = new Stack(); ArrayList list = new ArrayList();if(root == null){return list; }stack.push(root);while(!stack.empty()){ TreeNode node = stack.pop();list.add(node.val);if(node.right!=null){stack.push(node.right); }if(node.left != null){stack.push(node.left); } }return list; }
递归解法
ArrayList preOrderReverse(TreeNode root){ ArrayList result = new ArrayList(); preOrder2(root,result);return result; }void preOrder2(TreeNode root,ArrayList result){if(root == null){return; } result.add(root.val); preOrder2(root.left,result); preOrder2(root.right,result); }
13. 二叉树的中序遍历
ArrayList inOrder(TreeNode root){ ArrayList list = new ArrayList<(); Stack stack = new Stack(); TreeNode current = root;while(current != null|| !stack.empty()){while(current != null){stack.add(current); current = current.left; } current = stack.peek();stack.pop();list.add(current.val); current = current.right; }return list; }
14.二叉树的后序遍历
ArrayList postOrder(TreeNode root){ ArrayList list = new ArrayList();if(root == null){return list; }list.addAll(postOrder(root.left));list.addAll(postOrder(root.right));list.add(root.val);return list; }
15.前序遍历和后序遍历构造二叉树
TreeNode buildTreeNode(int[] preorder,int[] inorder){if(preorder.length!=inorder.length){return null; }return myBuildTree(inorder,0,inorder.length-1,preorder,0,preorder.length-1); }TreeNode myBuildTree(int[] inorder,int instart,int inend,int[] preorder,int prestart,int preend){if(instart>inend){return null; } TreeNode root = new TreeNode(preorder[prestart]);int position = findPosition(inorder,instart,inend,preorder[start]); root.left = myBuildTree(inorder,instart,position-1,preorder,prestart+1,prestart+position-instart); root.right = myBuildTree(inorder,position+1,inend,preorder,position-inend+preend+1,preend);return root; }int findPosition(int[] arr,int start,int end,int key){int i;for(i = start;i<=end;i++){if(arr[i] == key){return i; } }return -1; }
16.在二叉树中插入节点
TreeNode insertNode(TreeNode root,TreeNode node){if(root == node){return node; } TreeNode tmp = new TreeNode(); tmp = root; TreeNode last = null;while(tmp!=null){ last = tmp;if(tmp.val>node.val){ tmp = tmp.left; }else{ tmp = tmp.right; } }if(last!=null){if(last.val>node.val){ last.left = node; }else{ last.right = node; } }return root; }
17.输入一个二叉树和一个整数,打印出二叉树中节点值的和等于输入整数所有的路径
void findPath(TreeNode r,int i){if(root == null){return; } Stack stack = new Stack();int currentSum = 0; findPath(r, i, stack, currentSum); }void findPath(TreeNode r,int i,Stack stack,int currentSum){ currentSum+=r.val;stack.push(r.val);if(r.left==null&&r.right==null){if(currentSum==i){for(int path:stack){ System.out.println(path); } } }if(r.left!=null){ findPath(r.left, i, stack, currentSum); }if(r.right!=null){ findPath(r.right, i, stack, currentSum); }stack.pop(); }
18.二叉树的搜索区间
给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。
ArrayList result;ArrayList searchRange(TreeNode root,int k1,int k2){ result = new ArrayList(); searchHelper(root,k1,k2);return result; }void searchHelper(TreeNode root,int k1,int k2){if(root == null){return; }if(root.val>k1){ searchHelper(root.left,k1,k2); }if(root.val>=k1&&root.val<=k2){ result.add(root.val); }if(root.val searchHelper(root.right,k1,k2); } }
19.二叉树的层次遍历
ArrayList> levelOrder(TreeNode root){ ArrayList> result = new ArrayList>();if(root == null){return result; } Queue queue = new LinkedList();queue.offer(root);while(!queue.isEmpty()){int size = queue.size(); ArrayList< level = new ArrayList():for(int i = 0;i TreeNode node = queue.poll(); level.add(node.val);if(node.left != null){queue.offer(node.left); }if(node.right != null){queue.offer(node.right); } } result.add(Level); }return result; }
20.二叉树内两个节点的最长距离
二叉树中两个节点的最长距离可能有三种情况:
1.左子树的最大深度+右子树的最大深度为二叉树的最长距离
2.左子树中的最长距离即为二叉树的最长距离
3.右子树种的最长距离即为二叉树的最长距离
因此,递归求解即可
private static class Result{ int maxDistance; int maxDepth; public Result() { } public Result(int maxDistance, int maxDepth) { this.maxDistance = maxDistance; this.maxDepth = maxDepth; } } int getMaxDistance(TreeNode root){return getMaxDistanceResult(root).maxDistance; }Result getMaxDistanceResult(TreeNode root){if(root == null){ Result empty = new Result(0,-1);return empty; } Result lmd = getMaxDistanceResult(root.left); Result rmd = getMaxDistanceResult(root.right); Result result = new Result(); result.maxDepth = Math.max(lmd.maxDepth,rmd.maxDepth) + 1; result.maxDistance = Math.max(lmd.maxDepth + rmd.maxDepth,Math.max(lmd.maxDistance,rmd.maxDistance));return result; }
21.不同的二叉树
给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种?
int numTrees(int n ){int[] counts = new int[n+2]; counts[0] = 1; counts[1] = 1;for(int i = 2;i<=n;i++){for(int j = 0;j counts[i] += counts[j] * counts[i-j-1]; } }return counts[n]; }
22.判断二叉树是否是合法的二叉查找树(BST)
一棵BST定义为:
节点的左子树中的值要严格小于该节点的值。
节点的右子树中的值要严格大于该节点的值。
左右子树也必须是二叉查找树。
一个节点的树也是二叉查找树。
public int lastVal = Integer.MAX_VALUE;public boolean firstNode = true;public boolean isValidBST(TreeNode root) {// write your code hereif(root==null){return true; }if(!isValidBST(root.left)){return false; }if(!firstNode&&lastVal >= root.val){return false; } firstNode = false; lastVal = root.val;if (!isValidBST(root.right)) {return false; }return true; }
祝大家考试顺利。
作者:程序员小乐,专注于技术、算法、职场、感悟、面经、资讯分享给大家。打造一个有趣的公众号。微信公众号:程序员小乐(study_tech)
您还可以在以下平台找到我们
你点的每个在看,我都认真当成了喜欢
判断是否是完全二叉树_【数据结构】二叉树高频考试题目【代码模板】!相关推荐
- 数据结构树的基本操作_数据结构二叉树的基本操作~~~~
展开全部 用递归的636f70793231313335323631343130323136353331333330356335方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树: 2.输出二 ...
- c语言必背数据结构_数据结构(C语言)考试重点必背
第一章: 绪论 1.1 :数据结构课程的任务是:讨论数据的各种 逻辑结构 .在计算机中的存储结构以及 各种操作的算法设计. 1.2 :数据:是客观描述事物的数字.字符以及所有的能输入到计算机中并能被计 ...
- c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...
面试大厂必刷:LeetCode算法90题 1. 买股票的最佳时机 难度级别:简单 题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一 ...
- 数据结构:二叉树层序遍历和判断是否为完全二叉树
层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...
- 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef st ...
- mysql 遍历二叉树_数据结构——树与二叉树的遍历
目录 树 二叉树 二叉树的遍历 总结 参考资料 序 树是学习数据结构的时候非常重要的一个数据结构,尤其是二叉树更为重要.像Java的HashMap 就使用了红黑树,而Mysql的索引就使用到了B+树. ...
- C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)
目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...
- 数据结构_排序二叉树(C语言)
数据结构总目录 排序二叉树 1. 结构解析 排序二叉树的结构规则很简单,只遵循一个基本规则: 那就是在二叉树中,选择任意根结点,其左子树都比根节点小,右子树都比根节点大. 排序二叉树结构图 观察如下二 ...
- 数据结构知识点总结-树、二叉树、二叉树遍历、满二叉树、完全二叉树、查找二叉树、平衡二叉树、红黑树、B树、B+树
树 在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把它叫做 ...
最新文章
- ios 网络请求后 Crash
- C语言有符号整数最小值,16位带符号整数为什么是
- vb计算机水平考试笔试,2007年4月全国计算机等级考试二级VB笔试试卷及参考答案...
- mysql5.7 xtrabackup_MySQL 5.7 基于GTID建立运行主库的从库-xtrabackup+mysqldump
- MaxCompute理解数据、运算和用户的大脑:基于代价的优化器
- jQuery特效手风琴特效 手写手风琴网页特效
- 银监局计算机英语面试题及答案,2012年国家公务员银监局面试真题及参考答案...
- 关于如何在ASP.NET 2.0中定制Expression Builders
- URAL 1004 Sightseeing Trip
- 32*32的booth算法的乘法器
- Webbygram:网页版Instagram再生
- O2O商业模式目前的状态需看透什么?未来会呈现怎样的特征?
- 杂篇:随笔编程杂谈录--《隆中对》
- 方法finalizer()的应用
- vue前端生成词云图的方法
- 【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)
- 【产业互联网周报】阿里将暂停阿里云美国扩张计划;协同办公领域硝烟又起,华为推WeLink,企业微信与微信打通;申通全面迁至阿里云...
- ps2021直装版|ps2021中文直装版 v22.0.0.35附安装教程
- 北理python复试_北理复试及其初试超强总结(转)
- svn: E170001: 认证失败--文件夹不存在
热门文章
- SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版
- SAP Spartacus 4.0 ng serve 之后,localhost 4200 会后面自动添上 electronics-spa 吗?
- TypeScript 里 never 类型的用法举例
- 如何安装最新版本的 SAP ABAP Development Tool ( ADT ) 2021年度更新
- SAP Spartacus user form页面的css设计重构
- SAP Spartacus core fromOccBaseSites逻辑
- SAP Fiori Elements list report filter - implemented by framework
- 使用SAP Analytics Cloud显示新冠肺炎病毒感染人数的实时信息
- 如何为SAP API Portal上创建的API增添API key验证保护功能
- SAP UI5 Web Component里最简单的React列表控件的用法