本文来自公众号程序员小乐(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&&current.right!=null){                    queue.add(current.left);                    queue.add(current.right);                }else if(current.left!=null&&current.right==null){                    queue.add(current.left);                    hasNoChild = true;                }else if(current.left==null&&current.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)

您还可以在以下平台找到我们

你点的每个在看,我都认真当成了喜欢

判断是否是完全二叉树_【数据结构】二叉树高频考试题目【代码模板】!相关推荐

  1. 数据结构树的基本操作_数据结构二叉树的基本操作~~~~

    展开全部 用递归的636f70793231313335323631343130323136353331333330356335方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树: 2.输出二 ...

  2. c语言必背数据结构_数据结构(C语言)考试重点必背

    第一章: 绪论 1.1 :数据结构课程的任务是:讨论数据的各种 逻辑结构 .在计算机中的存储结构以及 各种操作的算法设计. 1.2 :数据:是客观描述事物的数字.字符以及所有的能输入到计算机中并能被计 ...

  3. c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...

    面试大厂必刷:LeetCode算法90题 1. 买股票的最佳时机 难度级别:简单 题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一 ...

  4. 数据结构:二叉树层序遍历和判断是否为完全二叉树

    层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...

  5. 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)

    typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef st ...

  6. mysql 遍历二叉树_数据结构——树与二叉树的遍历

    目录 树 二叉树 二叉树的遍历 总结 参考资料 序 树是学习数据结构的时候非常重要的一个数据结构,尤其是二叉树更为重要.像Java的HashMap 就使用了红黑树,而Mysql的索引就使用到了B+树. ...

  7. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  8. 数据结构_排序二叉树(C语言)

    数据结构总目录 排序二叉树 1. 结构解析 排序二叉树的结构规则很简单,只遵循一个基本规则: 那就是在二叉树中,选择任意根结点,其左子树都比根节点小,右子树都比根节点大. 排序二叉树结构图 观察如下二 ...

  9. 数据结构知识点总结-树、二叉树、二叉树遍历、满二叉树、完全二叉树、查找二叉树、平衡二叉树、红黑树、B树、B+树

    树 在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把它叫做 ...

最新文章

  1. ios 网络请求后 Crash
  2. C语言有符号整数最小值,16位带符号整数为什么是
  3. vb计算机水平考试笔试,2007年4月全国计算机等级考试二级VB笔试试卷及参考答案...
  4. mysql5.7 xtrabackup_MySQL 5.7 基于GTID建立运行主库的从库-xtrabackup+mysqldump
  5. MaxCompute理解数据、运算和用户的大脑:基于代价的优化器
  6. jQuery特效手风琴特效 手写手风琴网页特效
  7. 银监局计算机英语面试题及答案,2012年国家公务员银监局面试真题及参考答案...
  8. 关于如何在ASP.NET 2.0中定制Expression Builders
  9. URAL 1004 Sightseeing Trip
  10. 32*32的booth算法的乘法器
  11. Webbygram:网页版Instagram再生
  12. O2O商业模式目前的状态需看透什么?未来会呈现怎样的特征?
  13. 杂篇:随笔编程杂谈录--《隆中对》
  14. 方法finalizer()的应用
  15. vue前端生成词云图的方法
  16. 【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)
  17. 【产业互联网周报】阿里将暂停阿里云美国扩张计划;协同办公领域硝烟又起,华为推WeLink,企业微信与微信打通;申通全面迁至阿里云...
  18. ps2021直装版|ps2021中文直装版 v22.0.0.35附安装教程
  19. 北理python复试_北理复试及其初试超强总结(转)
  20. svn: E170001: 认证失败--文件夹不存在

热门文章

  1. SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版
  2. SAP Spartacus 4.0 ng serve 之后,localhost 4200 会后面自动添上 electronics-spa 吗?
  3. TypeScript 里 never 类型的用法举例
  4. 如何安装最新版本的 SAP ABAP Development Tool ( ADT ) 2021年度更新
  5. SAP Spartacus user form页面的css设计重构
  6. SAP Spartacus core fromOccBaseSites逻辑
  7. SAP Fiori Elements list report filter - implemented by framework
  8. 使用SAP Analytics Cloud显示新冠肺炎病毒感染人数的实时信息
  9. 如何为SAP API Portal上创建的API增添API key验证保护功能
  10. SAP UI5 Web Component里最简单的React列表控件的用法