给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4。(将中序遍历树,在遍历)

import java.util.*;public class Solution {TreeNode KthNode(TreeNode pRoot, int k) {List<Integer> list = new ArrayList<>();KthNode(pRoot, list);if (k<=0||k>list.size()){return null;}return new TreeNode(list.get(k-1));}//中序遍历 是按照大小的排列的public void KthNode(TreeNode root, List list) {//中序遍历 左右根if (root == null) {return;}if (root.left != null) {KthNode(root.left, list);}list.add(root.val);if (root.right != null) {KthNode(root.right, list);}}
}

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。(之字打印)

import java.util.*;
/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
public class Solution {ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();//存放每一个层的数据ArrayList<Integer> tmp = new ArrayList<Integer>();//存放的树中的节点的队列LinkedList<TreeNode> q = new LinkedList<TreeNode>();if (pRoot == null)return ret;q.add(pRoot);int now = 1, next = 0;while (!q.isEmpty()) {TreeNode t = q.remove();now--;tmp.add(t.val);if (t.left != null) {q.add(t.left);next++;}if (t.right != null) {q.add(t.right);next++;}if (now == 0) {//存放的是一行的数据ret.add(new ArrayList<Integer>(tmp));//清空第一行的数据tmp.clear();now = next;//赋值为0next = 0;}}return ret;}
}

请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
public class Solution {boolean isSymmetrical(TreeNode pRoot){return isMirror(pRoot,pRoot);}public boolean isMirror(TreeNode t1, TreeNode t2) {//如果是叶子节点的话,那么就是的返回相同 if (t1 == null && t2 == null) return true;// 如果有其中等于null另外一个不等于空的话,返回是false if (t1 == null || t2 == null) return false;//判断是节点的值是否相同 并判断左子树 和右子树是否相同return (t1.val == t2.val)&& isMirror(t1.right, t2.left)&& isMirror(t1.left, t2.right);}
}

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

public class Solution {public boolean IsBalanced_Solution(TreeNode root) {//判断首位平衡二叉树的就是判断左右子树的深度是否大于2?return recur(root) != -1;}public int recur(TreeNode root) {//如果等于的null返回是的0if (root == null) return 0;//计算左子树的长度int left = recur(root.left);if(left == -1) return -1;//计算右子树的长度int right = recur(root.right);if(right == -1) return -1;//判断左右子树的长度是否大于2? return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;}
}

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
import java.math.*;public class Solution {public int TreeDepth(TreeNode root) {//如果节点是null返回为0if(root == null) return 0;//计算左子树的深度int left=TreeDepth(root.left);//计算右子树的深度int ringht=TreeDepth(root.right);//返回的左右子树的大的值的加上1return Math.max(left,ringht) + 1;}
}

输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

import java.util.*;
public class Solution {// 全局变量,用于存储得到的每一个路径ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();/*** 建立额外一个函数,用来实现递归求解* @param root* @param target* @return*/public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {ArrayList<Integer> pathList = new ArrayList<Integer>();if (root == null) {return resultsList;}int curSum = 0;int index = 0;int []path = new int[1000];this.isTargetPath(root, target, curSum, path, index);return this.resultsList;}/*** 递归求解函数* 思路很明白,把根节点到叶节点的路径上的值都加起来,* 所以在递归的过程中,需要逐个累加,并且累加的同时,还要将沿途经过的节点值记录下来,* 如何在递归函数中实现这一切功能呢?参数!!可用传参的方式解决* @param eleNode   当前节点* @param target    目标和* @param curSum    当前已经累积到的和* @param path  记录到当前的节点位置,经过的路径* @param index 从根节点到当前节点为止,存的节点的数目*/public void isTargetPath(TreeNode eleNode, int target, int curSum, int []path, int index) {if (eleNode == null) {return;}curSum += eleNode.val;// 把该节点包含进去path[index] = eleNode.val;index ++;//当前已经是处于叶子节点,并且累计的和与target相等if (curSum == target && eleNode.left == null && eleNode.right == null) {// 将得到的结果放在外层结构中ArrayList<Integer> pathList = new ArrayList<Integer>();for (int i = 0; i < index; i++) {pathList.add(path[i]);}resultsList.add(pathList);return;}// 该节点有左子节点,前提还是要curSum 小于 target,否则递归就没有意义了if (curSum < target && eleNode.left != null) {this.isTargetPath(eleNode.left, target, curSum, path, index);}// 右子节点if (curSum < target && eleNode.right != null) {this.isTargetPath(eleNode.right, target, curSum, path, index);}}
}

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

import java.util.ArrayList;
/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;public class Solution {//这个题目就是相当于是一个层序的遍历public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {ArrayList<Integer> list = new ArrayList<Integer>();if(root == null) return list;Deque<TreeNode> deque = new LinkedList<TreeNode>();deque.add(root);while(!deque.isEmpty()){TreeNode t = deque.pop();list.add(t.val);if(t.left != null) deque.add(t.left);if(t.right != null) deque.add(t.right);}return list;}}

操作给定的二叉树,将其变换为源二叉树的镜像。

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
public class Solution {public void Mirror(TreeNode root) {//如果是空的返回是nullif (root == null) {return;}//节点的交换TreeNode temp = root.left;root.left = root.right;root.right = temp;//递归到左子树 Mirror(root.left);//递归到右子树Mirror(root.right);}
}

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {//如果是一种一个等于空的话返回是的falseif (root1 == null || root2 == null) {return false;}//否则就调用函数的 分别是去判断时候的根节点 或者是的左子树的节点 或者是右节点的的节点return help(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);}private boolean help(TreeNode root1, TreeNode root2) {//如果是2比较完成;那么就返回trueif (root2 == null) {return true;}//如果是1为空;那么就返回falseif (root1 == null) {return false;}//比较是的更加的值时候相同return root1.val == root2.val && help(root1.left, root2.left) && help(root1.right, root2.right);}
}

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/*** Definition for binary tree* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
import java.util.Arrays;public class Solution {public TreeNode reConstructBinaryTree(int[] pre, int[] in) {//递归函数的出口if (pre == null || pre.length == 0) {return null;}TreeNode root = new TreeNode(pre[0]);int index = findindex(pre, in);root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, index + 1), Arrays.copyOfRange(in, 0, index));root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, index + 1, pre.length), Arrays.copyOfRange(in, index + 1, in.length));return root;}public int findindex(int[] pre, int[] in) {for (int i = 0; i < in.length; i++) {if (in[i] == pre[0]) {return i;}}return -1;}
}

翻转二叉树

public TreeNode reveserTree(TreeNode root) {if(root==null){return null;}reveserTree(root.left);reveserTree(root.right);//翻转TreeNode temp=root.left;root.left=root.right;root.right=tmep;return root;}

算法问题——(树问题集合)相关推荐

  1. 《数据结构与算法》——树与二叉树之遍历总结

    <数据结构与算法>--树与二叉树之遍历总结 树与二叉树部分计划分为三次进行复习总结,第一次为基本概念和二叉树的遍历,第二次内容为线索二叉树以及树和森林,第三次为树与二叉树的应用. 目录 & ...

  2. 数据结构与算法图解——树

    文章目录 7. 树 7.1 树的逻辑结构 7.1.1 例题 7.2 树的基本术语 7.2.1 例题 7.3 二叉树的性质 7.3.1 性质1 7.3.2 性质2 7.3.3 性质3 7.3.4 性质4 ...

  3. 用python手写KNN算法+kd树及其BBF优化(原理与实现)(下篇)

    用python手写KNN算法+kd树及其BBF优化(原理与实现)(下篇) 接上一篇用python手写KNN算法+kd树及其BBF优化(原理与实现)(上篇) 我们使用training2和test2两个数 ...

  4. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考: 数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额 ...

  5. 数据结构与算法--B树原理及实现

    B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...

  6. [算法模板]树状数组

    [算法模板]树状数组 思路 图片转自:yhf_2015--彻底理解树状数组 使用这个图片就能很快的理解树状数组. 我们可以先根据图片来分解一个十进制数成二次幂. example: \(15=2^0+1 ...

  7. 数据结构与算法3 树(上)树与树的表示

    树与树的表示 树的概念顾名思义,建议百度 有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点? 每棵树的结点都比边多1,m棵树则多m,故共有m+k个结点 数据管理经常涉及的三个操作:删 ...

  8. AI:人工智能领域算法思维导图集合之有监督学习/无监督学习/强化学习类型的具体算法简介(预测函数/优化目标/求解算法)、分类/回归/聚类/降维算法模型选择思路、11类机器学习算法详细分类之详细攻略

    AI:人工智能领域算法思维导图集合之有监督学习/无监督学习/强化学习类型的具体算法简介(预测函数/优化目标/求解算法).分类/回归/聚类/降维算法模型选择思路.11类机器学习算法详细分类(决策树/贝叶 ...

  9. c语言线段树建树程序,C++算法 线段树

    线段树这个算法,看起来非常高端,而且很有用处,所以还是讲一下下吧. 温馨提示:写线段树前请做好写码5分钟,调试一辈子的准备^-^ 啊直接步入正题-- 首先我们考虑一个题目:有一个序列,要做到单点修改单 ...

  10. list集合 树 三层集合嵌套 {..{..{..}}}

    list集合 树 三层集合嵌套 {-{-{-}}} 查询一级分类所有 和一级分类下第一个子元素的二级集合 和第一个分类下的所有三级集合(用于手机端的商品分类 ) //记录分类编号Long cateId ...

最新文章

  1. centos amd双显卡_讯景RX590 AMD 50周年纪念版显卡评测
  2. 解决无法将类型为“System.Web.UI.WebControls.HiddenField”的对象强制转换为类型的错误...
  3. ecshop 去除前台模板自动解析CSS/JS/IMG路径
  4. 共模电感适用的频率_分析共模电感和差模电感寄生电容抵消的方法
  5. CVE-2019-2725复现(从环境搭建到getshell)
  6. html调用文章标题,HTML中文章标题标签的详细介绍
  7. ERROR [com.netflix.discovery.TimedSupervisorTask] - task supervisor timed out
  8. Cocos2d-html5 2.2.2的屏幕适配方案
  9. pandas 数据分析 相关性_Pandas库学习笔记2-Pandas数据特征分析
  10. [2018.10.25 T1] 妹子
  11. 什么是python的内置函数_python 内置函数
  12. 北航计算机学院国家奖学金,2019年经管学院研究生国家奖学金预审结果公示
  13. B站手机缓存的视频在电脑上转换观看
  14. 苹果M1芯片为何如此快?
  15. 商品详情页html手机,商品详情页.html
  16. 彻底搞懂python函数2
  17. 将svg图标转换成iconfont图标
  18. html5动画在线制作工具,KoolShow(HTML5动画制作工具)
  19. win10 metro app(应用商店中的APP)如何走代理?
  20. 解决 thymeleaf 中th 爆红

热门文章

  1. Elasticsearch7.17 二:mapping映射和高级语法查询DSL
  2. 19南大软院上岸学姐考研经验分享
  3. 已知T(n)=2T(n/2)+n,求O(n)?
  4. 有哪些小而美的中小厂?
  5. CMake Error: The current CMakeCache.txt directory is different...
  6. 学习编程比学开车要简单
  7. iOS直播APP流程和相关技术介绍
  8. Visual studio2022“无法生成.exe文件,系统找不到指定文件
  9. 用Python下载xkcd图片
  10. 方寸微电子T630 USB3.0超高速接口芯片 可替换赛普拉斯USB接口芯片 CYUSB3014 (应用:工业相机,视频会议, 3D打印, 高清B超,USB3.0视频采集卡, 高拍器、仪器仪表设备等)