二叉树 - 建立与遍历使用Java

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次

前序遍历:若二叉树为空,则空操作返回null。否则先访问根节点,然后前序遍历左子树,再前序遍历右子树

中序遍历:若二叉树为空,则空操作返回null。否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树

后序遍历:若二叉树为空,则空操作返回null。否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点

层序遍历:若树为空,空操作返回null。否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,从左到右对结点逐个访问

com

└── rust

└── datastruct

├── BinaryTree.java

└── TestBinaryTree.java

二叉树用一个类来实现,并包含内部类节点

以下是Java代码:

  1 package com.rust.datastruct;
  2
  3 public class BinaryTree {
  4     private int BinaryNodeCount = 0;
  5     BinaryNode root;
  6     public BinaryTree(){}
  7
  8     public BinaryNode createRoot(){
  9         return createRoot(1,null);
 10     }
 11     public BinaryNode createRoot(int key,String data){
 12         BinaryNode root = new BinaryNode(key, data);
 13         this.root = root;
 14         return root;
 15     }
 16
 17     public BinaryNode createNode(int key,String data){
 18         return new BinaryNode(key,data);
 19     }
 20     public int getNodeCount(){
 21         return BinaryNodeCount;
 22     }
 23     public BinaryNode getRoot(){
 24         return root;
 25     }
 26     public void visitNode(BinaryNode node){
 27         if (node == null) {
 28             return ;
 29         }
 30         node.setVisited(true);
 31         System.out.print(node.getData());
 32     }
 33     // 前序遍历
 34     public void preOrderTravels(BinaryNode node) {
 35         if (node == null) {
 36             return;
 37         } else {
 38             BinaryNodeCount++;
 39             visitNode(node);
 40             preOrderTravels(node.leftChild);
 41             preOrderTravels(node.rightChild);
 42         }
 43     }
 44     // 中序遍历
 45     public void midOrderTravels(BinaryNode node) {
 46         if (node == null) {
 47             return;
 48         } else {
 49             BinaryNodeCount++;
 50             midOrderTravels(node.leftChild);
 51             visitNode(node);
 52             midOrderTravels(node.rightChild);
 53         }
 54     }
 55     // 后序遍历
 56     public void postOrderTravels(BinaryNode node) {
 57         if (node == null) {
 58             return;
 59         } else {
 60             BinaryNodeCount++;
 61             postOrderTravels(node.leftChild);
 62             postOrderTravels(node.rightChild);
 63             visitNode(node);
 64         }
 65     }
 66
 67     class BinaryNode{
 68         private int key;
 69         private String data;
 70         private BinaryNode leftChild = null;
 71         private BinaryNode rightChild = null;
 72         private boolean isVisited = false;
 73
 74         public int getKey() {
 75             return key;
 76         }
 77         public void setKey(int key) {
 78             this.key = key;
 79         }
 80         public String getData() {
 81             return data;
 82         }
 83         public void setData(String data) {
 84             this.data = data;
 85         }
 86         public BinaryNode getLeftChild() {
 87             return leftChild;
 88         }
 89         public void setLeftChild(BinaryNode leftChild) {
 90             this.leftChild = leftChild;
 91         }
 92         public BinaryNode getRightChild() {
 93             return rightChild;
 94         }
 95         public void setRightChild(BinaryNode rightChild) {
 96             this.rightChild = rightChild;
 97         }
 98         public boolean isVisited() {
 99             return isVisited;
100         }
101         public void setVisited(boolean isVisited) {
102             this.isVisited = isVisited;
103         }
104         public BinaryNode(){
105
106         }
107         public BinaryNode(int key, String data){
108             this.key = key;
109             this.data = data;
110             this.leftChild = null;
111             this.rightChild = null;
112         }
113     }
114
115 }

里面内置前序遍历、中序遍历和后序遍历三种方法

 1 package com.rust.datastruct;
 2
 3 import com.rust.datastruct.BinaryTree.BinaryNode;
 4
 5 public class TestBinaryTree {
 6
 7     public static void main(String args[]){
 8         BinaryTree bt = new BinaryTree();
 9         initTree(bt, 1, "A");
10         System.out.println("********preOrderTravels********");
11         bt.preOrderTravels(bt.root);
12         System.out.println();
13         System.out.println("********midOrderTravels********");
14         bt.midOrderTravels(bt.root);
15         System.out.println();
16         System.out.println("********postOrderTravels********");
17         bt.postOrderTravels(bt.root);
18     }
19     /**
20      *               A
21      *        B            C
22      *    D     E      F     G
23      * H   I  J
24      * @param bt 输入一个二叉树对象,定义一个根结点
25      * @param rootKey
26      * @param rootData
27      */
28     public static void initTree(BinaryTree bt,int rootKey, String rootData){
29         BinaryNode root = bt.createRoot(rootKey, rootData);
30         BinaryNode nodeB = bt.createNode(2, "B");
31         BinaryNode nodeC = bt.createNode(3, "C");
32         BinaryNode nodeD = bt.createNode(4, "D");
33         BinaryNode nodeE = bt.createNode(5, "E");
34         BinaryNode nodeF = bt.createNode(6, "F");
35         BinaryNode nodeG = bt.createNode(7, "G");
36         BinaryNode nodeH = bt.createNode(8, "H");
37         BinaryNode nodeI = bt.createNode(9, "I");
38         BinaryNode nodeJ = bt.createNode(10, "J");
39         root.setLeftChild(nodeB);
40         root.setRightChild(nodeC);
41         nodeB.setLeftChild(nodeD);
42         nodeB.setRightChild(nodeE);
43         nodeC.setLeftChild(nodeF);
44         nodeC.setRightChild(nodeG);
45         nodeD.setLeftChild(nodeH);
46         nodeD.setRightChild(nodeI);
47         nodeE.setRightChild(nodeJ);
48     }
49 }

输出:

********preOrderTravels********

ABDHIEJCFG

********midOrderTravels********

HDIBEJAFCG

********postOrderTravels********

HIDJEBFGCA

·树,森林和二叉树

#树转换为二叉树

1.加线,在所有兄弟节点之间加一条线

2.去线,对树中每一个节点,只保留它与第一个孩子结点的连线,删除它与其它孩子节点之间的连线

3.层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定的角度,使其结构分明

#森林转换为二叉树

1.把每棵树转换为二叉树

2.第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子,

用线连起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。

#二叉树转换为树

右孩子都跨一层连接上去,删掉二叉树右孩子的连线

#二叉树转换为森林

逐层删掉右孩子的连线

时间: 2024-10-10 14:39:37

二叉树 - 建立与遍历使用Java的相关文章

二叉树建立和遍历

二叉树创建遍历规则: 1.先序:根-左-右 2.中序:左-根-右 3.后序:左-右-根 二叉树定义和辅助函数如下: struct node { int data; struct node* left; struct node* right; }; void visit(int data) { printf("%d ", data); } int indata() { int data; scanf("%d",&data); return data; } 先序

递归二叉树建立和遍历及深度计算

上篇咱们说到二叉树的一种建立方法及三种遍历方法的递归非递归算法.这篇换了一种新的建立方法,用先根遍历递归的思路建立二叉树,用递归的方法计算深度,用中根递归和非递归方法遍历整个二叉树. BinaryTree.h //二叉树的建立和遍历 #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #include <iostream> typedef int T; struct Node { T data; Node *lch; Node *rch; }; class

二叉树建立,遍历和二叉排序树的判断【c++】

// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; typedef struct BTree{ char val; struct BTree *lchild,*rchild; }BTree; //先序建立二叉树 BTree * CreateBTree(BTree *T

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 下面用Java实现对二叉树的先序遍历,中序遍历,后序遍历.广度优先遍历.深度优先遍历.转摘请注明:http://blog.csdn.net/qiuzhping/article/details/44830369 package com.qiuz

二叉树的遍历及其Java实现

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,对二叉树的遍历就是将非线性结构的二叉树中的节点排列在一个线性序列上的过程.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 如果采用顺序结构来保存二叉树,遍历二叉树非常容易,直接遍历底层数组即可.如果采用链表来保存,则有以下两类遍历方式: 深度优先遍历:先访问树中最深层次的节点 广度优先遍历:逐层访问每层节点,先访问根节点,然后访问第二层的节点..

二叉树的建立与遍历(二)(c++实现)

[目标] 建立如下所示的一棵二叉树,并且输出其对应的前序遍历.中序遍历.后序遍历. [代码实现] // Binarytree.h #ifndef Binarytree_H #define Binarytree_H template<class T> class Binarytree; template<class T> class TreeNode { friend class Binarytree<T>; private: T data; TreeNode<T&

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 用 数组下标表示法 表示一个节点 二叉树的主要方法 二叉树的创建 二叉树的添加元素 二叉树的删除元素 二叉树的清空 获得二叉树的高度 获得二叉树的节点数 获得某个节点的父亲节点 二叉树的遍历 先序遍历 中序遍历 后序遍历 遍历小结 总结 树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

C语言二叉树的建立与遍历

二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式差不多.也分好几种方式建立,这里 就写一种,就是先序建立 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct TreeNode{ 5 char ch; 6 struct TreeNode *lchild, *rch