实现二叉树的基本操作(Java版)
近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码:
package com.sf.test; import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack; public class TreeMain { public static void main(String[] agrs) {
int[] arr = {5,17,15,19,4,8,7,10,9,14,16};
TreeNode root = new TreeNode();
root.data = 11;
System.out.println("TreeMain start");
//创建二叉树
for(int item :arr) {
createTree(root,item);
} //先序遍历
System.out.println("先序遍历:");
preOrderTraverse(root); System.out.println("中序遍历");
//中序遍历
midOrderTraverse(root); System.out.println("后序遍历");
//后序遍历
postOrderTraverse(root); System.out.println("广度遍历");
//广度遍历
layOrderTraverse(root); System.out.println("深度遍历");
//深度遍历
deepOrderTraverse(root); //查找节点
find(root,10); System.out.println("树的高度:"+height(root)); System.out.println("TreeMain end");
} /**
* 根据现有数据 生成二叉树
* @param node
* @param data
*/
public static TreeNode createTree(TreeNode node,int data) {
if(null==node) {
node = new TreeNode();
node.data = data;
return node;
}else {
if(data>node.data){
node.right = createTree(node.right,data);
}else {
node.left = createTree(node.left,data); }
}
return node;
} /**
* 先序遍历
* @param node
*/
public static void preOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
System.out.println(node.data+",");
preOrderTraverse(node.left);
preOrderTraverse(node.right);
} /**
* 中序遍历
* @param node
*/
public static void midOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
midOrderTraverse(node.left);
System.out.println(node.data+",");
midOrderTraverse(node.right);
} /**
* 后序遍历
* @param node
*/
public static void postOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
postOrderTraverse(node.left);
postOrderTraverse(node.right);
System.out.println(node.data+",");
} /**
* 广度遍历
* @param root
*/
public static void layOrderTraverse(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
if(null!=root) {
System.out.println(root.data);
q.add(root.left);
q.add(root.right);
while(!q.isEmpty()) {
TreeNode node = q.poll();
System.out.println(node.data);
if(null!=node.left) {
q.add(node.left);
}
if(null!=node.right) {
q.add(node.right);
}
}
}
} /**
* 深度遍历
* @param root
*/
public static void deepOrderTraverse(TreeNode root) {
Stack<TreeNode> q = new Stack<>();
if(null!=root) {
System.out.println(root.data);
q.push(root.right);
q.push(root.left);
while(!q.isEmpty()) {
TreeNode node = q.pop();
System.out.println(node.data);
if(null!=node.right) {
q.push(node.right);
}
if(null!=node.left) {
q.push(node.left);
}
}
}
} /**
* 查找节点
* @param root 根节点
* @param data 数据
*/
public static void find(TreeNode node,int data) {
if(null==node) {
System.out.println("没有找到节点");
return ;
}
if(data>node.data){
find(node.right,data);
}else if(data<node.data){
find(node.left,data);
}else {
System.out.println("找到节点:"+data);
}
} /**
* 删除节点
* @param root 根节点
* @param data 数据
*/
public static void delete(TreeNode node,int data) {
if(null==node) {
System.out.println("没有找到节点");
return ;
}
if(data>node.data){
find(node.right,data);
}else if(data<node.data){
find(node.left,data);
}else {
System.out.println("找到节点:"+data);
if(null==node.left||null==node.right) {
//直接删除节点,
}else {
//取右子树最大的节点替换此节点,自己去实现了(哈哈)
}
}
} /**
* 求树的高度
* @param node
* @return
*/
public static int height(TreeNode node) {
if(null==node) {
return 0;
}
int hLeft = height(node.left) +1;
int hRight = height(node.right)+1;
return hLeft>hRight?hLeft:hRight;
} }
节点实体:
为了操作方便,属性都定义成public了,实际应用还是定义为private
package com.sf.test;
public class TreeNode {
//数据
public int data;
//左节点
public TreeNode left;
//右节点
public TreeNode right;
}
二叉树的相关算法还是有点复杂的,要经常温习,一段时间不用基本上就忘了,所以我用博客记录下来实现的过程,并与大家分享。
实现二叉树的基本操作(Java版)的更多相关文章
- 树的基本操作java版
看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等..这里参考了西电版的数据结构,基本用的都是递归实现的. 很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为 ...
- Elasticsearch 6.4基本操作 - Java版
1. Elasticsearch Java API有四类client连接方式 TransportClient RestClient Jest Spring Data Elasticsearch 其中T ...
- 二叉树的宽度<java版>
二叉树的宽度 思路:层序遍历的时候,记录每层的节点数量,最后取记录中的最多的数量. 代码实现: public int solution(TreeNode node){ LinkedList<Tr ...
- 二叉树的深度<java版>
二叉树的结构 二叉树是比较常见的一种的一种数据结构. 首先看看二叉树的数据结构: //由左节点和右节点以及一个节点值构成 public class TreeNode{ TreeNode leftNod ...
- 《剑指offer》面试题19 二叉树的镜像 Java版
书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律.最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点.搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍 ...
- 将一个二叉树左右翻转(Java 版)
public class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; ...
- 二叉树的基本操作(C语言版)
今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆.二叉树是链式存储结构,用的是二叉 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 【剑指offer】Java版代码(完整版)
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
随机推荐
- webpack 图片资源处理
备注: css 引用图片资源 1. 安装loader yarn add file-loader --dev 2. 配置 const path = require("path"); ...
- Helm Charts
Use this repository to submit official Charts for Kubernetes Helm. Charts are curated application de ...
- vue数据已渲染成 但还是报错 变量 undefined
问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...
- strlen和sizeof的长度区别
strlen返回字符长度 而sizeof返回整个数组占多长,字符串的\0也会计入一个长度
- hyperledger fabric共识组件分析 --背书策略
在fabric中,共识过程意味着多个节点对于某一批交易的发生顺序.合法性以及它们对账本状态的更新结构达成一致的观点.满足共识则意味着多个节点可以始终保证相同的状态,对于以同样顺序到达的交易可以进行一致 ...
- xshell 提示 继续使用此程序必须应用到最新的更新或使用新版本 的解决方案
当打开正在使用的xshell后,提示“继续使用此程序必须应用到最新的更新或使用新版本 ” 是因为我们正在使用的是xshell5 版本,需要我们再安装一个xshell6 版本 我个人使用的是家庭/教育 ...
- Unit04: JavaScript 概述 、 JavaScript 基础语法 、 流程控制
Unit04: JavaScript 概述 . JavaScript 基础语法 . 流程控制 my.js function f3() { alert("唐胜伟"); } demo1 ...
- 如何使用indexdb
一.实现步骤 1)获得indexedDB对象 if (!window.indexedDB) { window.indexedDB = window.mozIndexedDB || window.web ...
- java代码------计算器
总结:我用if()语句写计算功能的代码时,实现不了,与switch_-catch语句不一样.不知到怎么实现 package com.p; import javax.swing.*; import ja ...
- 关于git rebase的相关讲解
http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin" ...