packagecom.xk.test.struct.newp;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Stack;public classMyBinaryTree {/*** 插入节点

*@paramroot

*@paramnode

*@return

*/TreeNode insertNode(TreeNode root,TreeNode node){if(root ==node){returnnode;

}

TreeNode tmp= newTreeNode();

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;

}

}returnroot;

}/*** 递归解法前序遍历

*@paramroot

*@return

*/ArrayListpreOrderReverse(TreeNode root){

ArrayList result = new ArrayList();

preOrder2(root,result);returnresult;

}void preOrder2(TreeNode root,ArrayListresult){if(root == null){return;

}

result.add(root.val);

preOrder2(root.left,result);

preOrder2(root.right,result);

}/*** 迭代解法前序遍历

*@paramroot

*@return

*/ArrayListpreOrder(TreeNode root){

Stack stack = new Stack();

ArrayList list = new ArrayList();if(root == null){returnlist;

}

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

}

}returnlist;

}/*** 中序遍历

*@paramroot

*@return

*/ArrayListinOrder(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;

}returnlist;

}/*** 后序遍历

*@paramroot

*@return

*/ArrayListpostOrder(TreeNode root){

ArrayList list = new ArrayList();if(root == null){returnlist;

}

list.addAll(postOrder(root.left));

list.addAll(postOrder(root.right));

list.add(root.val);returnlist;

}/*** 最大深度

*@paramnode

*@return

*/

intmaxDeath(TreeNode node){if(node==null){return 0;

}int left =maxDeath(node.left);int right =maxDeath(node.right);return Math.max(left,right) + 1;

}/*** 层次遍历

*@paramroot

*@return

*/ArrayList>levelOrder(TreeNode root){

ArrayList> result = new ArrayList>();if(root == null){returnresult;

}

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

}returnresult;

}/*** 最小深度

*@paramroot

*@return

*/

intgetMinDepth(TreeNode root){if(root == null){return 0;

}returngetMin(root);

}intgetMin(TreeNode root){if(root == null){returnInteger.MAX_VALUE;

}if(root.left == null&&root.right == null){return 1;

}return Math.min(getMin(root.left),getMin(root.right)) + 1;

}/*** 节点的个数

*@paramroot

*@return

*/

intnumOfTreeNode(TreeNode root){if(root == null){return 0;

}int left =numOfTreeNode(root.left);int right =numOfTreeNode(root.right);return left + right + 1;

}/*** 叶子节点的个数

*@paramroot

*@return

*/

intnumsOfNodeTreeNode(TreeNode root){if(root == null){return 0;

}if(root.left==null&&root.right==null){return 1;

}return numsOfNodeTreeNode(root.left)+numsOfNodeTreeNode(root.right);

}/*** 第k层节点的个数

*@paramroot

*@paramk

*@return

*/

int numsOfkLevelTreeNode(TreeNode root,intk){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;

}/*** 翻转二叉树or镜像二叉树

*@paramroot

*@return

*/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;returnroot;

}/*** 两个二叉树是否互为镜像

*@paramt1

*@paramt2

*@return

*/

booleanisMirror(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);

}/*** 是否是平衡二叉树

* 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

*@paramnode

*@return

*/

booleanisBalanced(TreeNode node){return maxDeath2(node)!=-1;

}intmaxDeath2(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;

}/*** 是否是完全二叉树

* 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

*@paramroot

*@return

*/

booleanisCompleteTreeNode(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;

}

}

}returnresult;

}/*** 是否是合法的二叉查找树(BST)

一棵BST定义为:

节点的左子树中的值要严格小于该节点的值。

节点的右子树中的值要严格大于该节点的值。

左右子树也必须是二叉查找树。

一个节点的树也是二叉查找树。*/

public int lastVal =Integer.MAX_VALUE;public boolean firstNode = true;public booleanisValidBST(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;

}/*** 把二叉树打印成多行

*@parampRoot

*@return

*/ArrayList >Print(TreeNode pRoot) {

ArrayList > res = new ArrayList >();if(pRoot == null)returnres;

ArrayList temp = new ArrayList();

Queue layer = new LinkedList();

layer.offer(pRoot);int start = 0, end = 1;while(!layer.isEmpty()){

TreeNode node=layer.poll();

temp.add(node.val);

start++;if(node.left != null)

layer.add(node.left);if(node.right != null)

layer.add(node.right);if(start ==end){

start= 0;

res.add(temp);

temp= new ArrayList();

end=layer.size();

}

}returnres;

}/*** 按之字形顺序打印二叉树

*@parampRoot

*@return

*/

public ArrayList >PrintZ(TreeNode pRoot) {

ArrayList > res = new ArrayList >();

Stack s1 = new Stack();

Stack s2 = new Stack();int flag = 1;if(pRoot == null)returnres;

s2.push(pRoot);

ArrayList temp = new ArrayList();while(!s1.isEmpty() || !s2.isEmpty()){if(flag % 2 != 0){while(!s2.isEmpty()){

TreeNode node=s2.pop();

temp.add(node.val);if(node.left != null){

s1.push(node.left);

}if(node.right != null){

s1.push(node.right);

}

}

}if(flag % 2 == 0){while(!s1.isEmpty()){

TreeNode node=s1.pop();

temp.add(node.val);if(node.right != null){

s2.push(node.right);

}if(node.left != null){

s2.push(node.left);

}

}

}

res.add(new ArrayList(temp));

temp.clear();

flag++;

}returnres;

}

}classTreeNode{intval;//左孩子

TreeNode left;//右孩子

TreeNode right;

}

java二叉树怎么初始化_java实现二叉树常见操作相关推荐

  1. 二叉树初始化_Java实现二叉树

    二叉查找树 二叉查找树(Binary Search Tree)也叫排序树或有序树或搜索树,它是为实现快速查找而生.二叉查找树的左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,因此若按中序 ...

  2. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

    package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...

  3. java二叉树是什么_java数据结构二叉树是什么?特点是?

    二叉树是什么?学习java的小伙伴可能经常会听到这个词,但具体是什么又不可知,下面小编就来带你详细了解下二叉树. 二叉树概念 二叉树,指计算机中的一种树结构,这种树结构中每个结点至多只有两个子树,它们 ...

  4. java中的文件_JAVA中文件的操作

    在java中,对文件(例如图片)进行操作,包括上传.修改.删除 一,文件上传 1.文件传到哪里,不仅可以保存在数据库中,也可以上传到远程服务器,文件保存的是文件的路径 2.文件上传都需要做什么?写那些 ...

  5. java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例

    本文实例讲述了java实现二叉树的建立.计算高度与递归输出操作.分享给大家供大家参考,具体如下: 1. 建立 递归输出 计算高度 前中后三种非递归输出 public class Tree_Link { ...

  6. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  7. java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树

    Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...

  8. java二叉树的深度_Java实现二叉树的深度计算

    尝试不同方法求二叉树的深度: 1.depth1,递归计算二叉树的深度,根结点的深度=max(左子树的深度,右子树的深度) + 1. 2.depth2,访问左结点,如有右结点则压栈1,同时把右结点的深度 ...

  9. java编程的英文_Java编程基础常见英语词汇总编

    Java编程基础常见英语词汇总编 以下是百分网小编收集的Java编程基础常见英语词汇,希望对您的学习有所帮助! Java编程基础常见英语词汇 OO:object-oriented ,面向对象 OOP: ...

最新文章

  1. 最后生成神么格式的代码_智能扩充机器人的“标准问”库之Query生成
  2. Geoserver怎样设置地图shp文件为相对路径,可轻松复制移植
  3. 【Python】Python办公自动化 | 一键给PDF文件加密,超方便
  4. Struts2 入门
  5. CDOJ 486 Good Morning 傻逼题
  6. 中国计算机考试区别及求职的相关思考
  7. 只知道大数据?你out了
  8. python hashlib 哈希算法
  9. java实例属性_Java 静态属性与实例属性的初始化
  10. 在eclipse中使用git创建本地库,以及托管项目到GitHub超详细教程
  11. python 随机选择数字
  12. 路由器PPPoE拨号密码(ADSL密码)找出方法 ZT
  13. html提示更新浏览器的代码,IE9及以下浏览器升级提示
  14. 开机启动bat以及隐藏运行窗口
  15. html黑洞效果,HTML5 Canvas炫酷宇宙黑洞引力特效
  16. python怎么读xlsx_使用Python读取xlsx文件
  17. Unity编辑器扩展——撤回
  18. ubuntu如何安装libz库
  19. Python串口异步通信
  20. html获取当前ip地址_IP地址精准查询

热门文章

  1. 不一样的排序算法【并行排序】
  2. Go语言安装并配置环境变量
  3. python3输出不换行_python3不换行输出
  4. 大神note3千元指纹机,这是要逼疯友商吗
  5. mysql滴一声弹出,关于mysql数据库在输入密码后,滴的一声直接退出
  6. python识别图片内容并获取两个地点间的距离
  7. 达芬奇五年沉浮—嵌入式处理器架构之争决战2012
  8. linux捕获鼠标点击事件文件,linux获得键盘鼠标事件,模拟键盘鼠标按键
  9. Java程序中用JFreeChart制作图形报表-Java基础-Java-编程开发
  10. 【高项】第8章 项目质量管理【知识点精华笔记】