创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

关于二叉树一些数据结构和算法相关的题目

85xj_TheAlgorit 2018-02-07 13:57 次阅读

最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。先上二叉树的数据结构:

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

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 < size ;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

22.判断二叉树是否是合法的二叉查找树(BST)

一棵BST定义为:节点的左子树中的值要严格小于该节点的值。节点的右子树中的值要严格大于该节点的值。左右子树也必须是二叉查找树。一个节点的树也是二叉查找树。

public int lastVal = Integer.MAX_VALUE; public boolean firstNode = true; public boolean isValidBST(TreeNode root) { // write your code here if(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; }

深刻的理解这些题的解法思路,在面试中的二叉树题目就应该没有什么问题

  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11078
收藏 人收藏

    评论

    相关推荐

    二叉树的最小深度

    遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
    的头像 算法与数据结构 发表于 04-28 16:27 474次 阅读

    C语言数据结构:什么是二叉树?

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
    的头像 C语言编程学习基地 发表于 04-21 16:20 469次 阅读

    如何使用 go 实现红黑树

    二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
    的头像 Linux爱好者 发表于 03-21 11:54 392次 阅读

    二叉树上应该怎么求

      二叉树上应该怎么求,二叉搜索树上又应该怎么求? 在求众数集合的时候有一个技巧,因为题目中众数是可....
    的头像 算法与数据结构 发表于 11-22 11:32 589次 阅读

    数据结构与算法分析中的二叉树与堆有关知识汇总

    该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
    发表于 11-03 09:37 139次 阅读

    二叉排序树AVL如何实现动态平衡

      什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
    的头像 算法与数据结构 发表于 10-28 17:02 642次 阅读
    二叉排序树AVL如何实现动态平衡

    算法学习中如何打印二叉树节点

    大家好,我是吴师兄,直接开始今天的算法学习,冲冲冲。 一、题目描述 从上到下打印出二叉树的每个节点,....
    的头像 算法与数据结构 发表于 10-22 09:37 687次 阅读

    如何修剪二叉搜索树

      如果不对递归有深刻的理解,本题有点难。单纯移除一个节点那还不够,要修剪! 669. 修剪二叉搜索....
    的头像 算法与数据结构 发表于 10-11 14:16 620次 阅读

    C++基础语法中的二叉树详解

    本期是C++基础语法分享的第十四节,今天给大家来梳理一下树!   二叉树 BinaryTree.cp....
    的头像 C语言编程学习基地 发表于 09-29 18:02 1109次 阅读

    如何才能够翻转二叉树

    这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 但正是因为这道题太简单,一看就会,一....
    的头像 新材料在线 发表于 09-01 11:45 926次 阅读

    C语言编程中如何求出二叉树后序遍历

    题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....
    的头像 C语言编程基础 发表于 08-23 11:04 2852次 阅读

    二叉树的所有路径介绍

    以为只用了递归,其实还用了回溯 257. 二叉树的所有路径 题目地址:https://leetcod....
    的头像 新材料在线 发表于 08-13 17:51 1495次 阅读
    二叉树的所有路径介绍

    二叉树的前序遍历非递归实现

    我们之前说了二叉树基础及二叉的几种遍历方式及练习题,今天我们来看一下二叉树的前序遍历非递归实现。 前....
    的头像 算法与数据结构 发表于 05-28 13:59 752次 阅读

    面试官考点之索引是什么?

    可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不....
    的头像 数据分析与开发 发表于 03-05 10:37 1119次 阅读
    面试官考点之索引是什么?

    建立决策树的逻辑

    像上面的这样的二叉树状决策在我们生活中很常见,而这样的选择方法就是决策树。机器学习的方法就是通过平时....
    的头像 深度学习自然语言处理 发表于 10-10 10:44 1548次 阅读
    建立决策树的逻辑

    Max Howell因为不会翻转一棵二叉树,被Google拒绝

    Max Howell 就是 Homebrew 的创作者,也是一名业内知名的 MacOS / iOS ....
    的头像 算法与数据结构 发表于 09-03 10:52 9890次 阅读

    Offer系列面试题0:重建二叉树

    以本题的序列为例,前序遍历序列的第一个数字 3 就是根结点的值,在中序遍历序列,找到根结点值的位置。....
    的头像 算法与数据结构 发表于 07-09 15:03 932次 阅读
    Offer系列面试题0:重建二叉树

    红黑树(Red Black Tree)是一种自平衡的二叉搜索树

    平衡(Balance):就是当结点数量固定时,左右子树的高度越接近,这棵二叉树越平衡(高度越低)。而....
    的头像 算法与数据结构 发表于 07-01 15:05 1719次 阅读
    红黑树(Red Black Tree)是一种自平衡的二叉搜索树

    删除二叉搜索树中的节点

    因为是二叉搜索树,对于树上每个节点来说,其 右子树的节点都要大于其左子树的节点 ,那么要找对应节点,....
    的头像 算法与数据结构 发表于 06-23 10:33 2029次 阅读
    删除二叉搜索树中的节点

    一个数据结构-线段树

    对于求区间和的问题,前缀和数组 是一个不错的选择,构建好前缀和数组后,求一个区间和的话只要前后一减就....
    的头像 算法与数据结构 发表于 05-06 11:02 2180次 阅读
    一个数据结构-线段树

    面试二叉树看这11个就够了

    根据前、中序遍历的特点,(根左右、左根右),先根据前序遍历确定根节点,然后在中序遍历知道该根节点的左....
    的头像 算法与数据结构 发表于 11-27 16:25 2654次 阅读

    面试算法之重建二叉树

    那么问题来了,只知道前序遍历能不能反推二叉树呢?我们就试一下,比如题目中所述,{1,2,4,7,3,....
    的头像 算法与数据结构 发表于 11-27 15:59 1838次 阅读

    一份用Python代码实现算法的资源帖,涵盖从入门到高级的各类算法

    在这个项目中并不是对所有内容都进行了详细介绍,有部分主题的代码非常丰富。为了帮助大家高效地利用这一学....
    的头像 city_prolove 发表于 05-11 10:30 2165次 阅读
    一份用Python代码实现算法的资源帖,涵盖从入门到高级的各类算法

    二叉树,一种基础的数据结构类型

    然后我们再定义一棵深度也为 3 的二叉树,该二叉树的 n 个结点(n≤7),当从 1 到 n 的每个....
    的头像 人工智能头条 发表于 04-13 10:48 3103次 阅读
    二叉树,一种基础的数据结构类型

    数据结构与算法:图的遍历过程中,搜索方法的不同

    图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶....
    的头像 city_prolove 发表于 04-04 16:40 2770次 阅读
    数据结构与算法:图的遍历过程中,搜索方法的不同

    普及一下程序猿们经常遇见的树

    趁着这个植树节,普及一下程序猿们经常遇见的树。B树的插入会发生结点的分裂操作。当插入操作引起了 s ....
    的头像 city_prolove 发表于 03-13 09:31 2237次 阅读

    基于二叉树的ensemble异常检测算法

    xi样本点的isolation需要大概12次划分,而异常点x0指需要4次左右。因此,我们可以根据划分....
    的头像 人工智能爱好者社区 发表于 12-11 16:57 3036次 阅读
    基于二叉树的ensemble异常检测算法

    4中二叉树的遍历方式介绍

    对于一种数据结构而言,遍历是常见操作。二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2....
    的头像 人工智能爱好者社区 发表于 04-27 17:23 3863次 阅读
    4中二叉树的遍历方式介绍

    B-Tree与二叉查找树的对比

    从前面分析情况来看,减少磁盘IO的次数就必须要压缩树的高度,让瘦高的树尽量变成矮胖的树,所以B-Tr....
    的头像 Linux阅码场 发表于 04-15 10:54 7860次 阅读
    B-Tree与二叉查找树的对比

    一文详解红黑树

    红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发....
    的头像 算法与数据结构 发表于 02-02 17:25 3520次 阅读
    一文详解红黑树

    熵的二叉树多类支持向量机的漏洞分类

    为了有效提高漏洞分类的准确性,针对基于二叉树多类支持向量机分类算法的分类复杂性和分类结果依赖二叉树的....
    发表于 01-25 10:40 643次 阅读

    AVL 树和普通的二叉查找树的详细区别分析

    那 AVL 树和普通的二叉查找树有何区别呢?如图,如果我们插入的是一组有序上升或下降的数据,则一棵普....
    的头像 算法与数据结构 发表于 01-15 14:36 4271次 阅读
     AVL 树和普通的二叉查找树的详细区别分析

    基于二叉树的多用户ORAM改进方案

    随着大数据及数据挖掘技术的发展,云计算环境中用户访问模式成为泄露用户隐私的一条途径.不经意随机存取技....
    发表于 01-13 11:05 419次 阅读

    基于二叉树的算术编码二值化方法

    在算术编码研究中,待编码的语法元素需要采用何种二值化方法以及二值化后每个比特的概率模型选择是算术编码....
    发表于 01-03 16:53 471次 阅读

    基于二叉树的电子系统故障诊断专家系统

    在分析专家系统发展及其在电子系统故障诊断中应用状况的基础上,针对当前装甲装备电子系统故障诊断中先进的....
    发表于 12-13 14:51 528次 阅读
    基于二叉树的电子系统故障诊断专家系统

    二叉树层次遍历算法的验证

    实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,....
    发表于 11-28 01:05 1351次 阅读
    二叉树层次遍历算法的验证

    二叉树的前序遍历、中序遍历、后续遍历的非递归实现

    前序遍历:先访问该节点,然后访问该节点的左子树和右子树; 中序遍历:先访问该节点的左子树,然后访问....
    发表于 11-27 11:24 740次 阅读

    二叉树基本操作课程设计

    课程设计
    发表于 10-12 08:50 408次 阅读

    二叉树实验报告_数据结构

    发表于 06-25 16:19 510次 阅读

    基于二叉树的时序电路测试序列设计

    为了实现时序电路状态验证和故障检测,需要事先设计一个输入测试序列。基于二叉树节点和树枝的特性,建立时....
    发表于 07-12 13:57 621次 阅读
    基于二叉树的时序电路测试序列设计

    基于二叉树满足MC DC测试用例设计方法

    软件测试是保证软件质量的有效方法,但测试工作过程繁琐,工作量较多。探索高效、可靠的测试用例设计方法一....
    发表于 03-01 16:22 610次 阅读

    二叉树算法在单总线上的C51 软件实现The Impleme

    单总线技术是一种新技术,由于所有的单总线器件均并联在一条信号线上,其信号传输较慢,主要应用于低速测控....
    发表于 06-01 11:20 446次 阅读