二叉数的遍历

  1 import java.util.LinkedList;
  2 import java.util.List;
  3
  4 /**
  5  * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历
  6  *
  7  * 参考资料0:数据结构(C语言版)严蔚敏
  8  *
  9  * 参考资料1:http://zhidao.baidu.com/question/81938912.html
 10  *
 11  * 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
 12  *
 13  * @author [email protected] @date: 2011-5-17
 14  *
 15  */
 16 public class BinTreeTraverse {
 17
 18     private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 19     private static List<Node> nodeList = null;
 20
 21     /**
 22      * 内部类:节点
 23      *
 24      * @author [email protected] @date: 2011-5-17
 25      *
 26      */
 27     private static class Node {
 28         Node leftChild;
 29         Node rightChild;
 30         int data;
 31
 32         Node(int newData) {
 33             leftChild = null;
 34             rightChild = null;
 35             data = newData;
 36         }
 37     }
 38
 39     public void createBinTree() {
 40         nodeList = new LinkedList<Node>();
 41         // 将一个数组的值依次转换为Node节点
 42         for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
 43             nodeList.add(new Node(array[nodeIndex]));
 44         }
 45         // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
 46         for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
 47             // 左孩子
 48             nodeList.get(parentIndex).leftChild = nodeList
 49                     .get(parentIndex * 2 + 1);
 50             // 右孩子
 51             nodeList.get(parentIndex).rightChild = nodeList
 52                     .get(parentIndex * 2 + 2);
 53         }
 54         // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
 55         int lastParentIndex = array.length / 2 - 1;
 56         // 左孩子
 57         nodeList.get(lastParentIndex).leftChild = nodeList
 58                 .get(lastParentIndex * 2 + 1);
 59         // 右孩子,如果数组的长度为奇数才建立右孩子
 60         if (array.length % 2 == 1) {
 61             nodeList.get(lastParentIndex).rightChild = nodeList
 62                     .get(lastParentIndex * 2 + 2);
 63         }
 64     }
 65
 66     /**
 67      * 先序遍历
 68      *
 69      * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
 70      *
 71      * @param node
 72      *            遍历的节点
 73      */
 74
 75
 76     public static void preOrderTraverse(Node node) {
 77         if (node==null)
 78         {
 79             return;
 80         }
 81
 82         System.out.print(node.data+" ");
 83         preOrderTraverse(node.leftChild);
 84
 85         preOrderTraverse(node.rightChild);
 86     }
 87
 88     /**
 89      * 中序遍历
 90      *
 91      * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
 92      *
 93      * @param node
 94      *            遍历的节点
 95      */
 96     public static void inOrderTraverse(Node node) {
 97         if (node==null)
 98         {
 99             return ;
100         }
101
102         inOrderTraverse(node.leftChild);
103         System.out.print(node.data+" ");
104         inOrderTraverse(node.rightChild);
105     }
106
107     /**
108      * 后序遍历
109      *
110      * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
111      *
112      * @param node
113      *            遍历的节点
114      */
115     public static void postOrderTraverse(Node node) {
116         if (node==null)
117         {
118             return ;
119         }
120
121         postOrderTraverse(node.leftChild);
122         postOrderTraverse(node.rightChild);
123         System.out.print(node.data+" ");
124     }
125
126     public static void main(String[] args) {
127         BinTreeTraverse binTree = new BinTreeTraverse();
128         binTree.createBinTree();
129         // nodeList中第0个索引处的值即为根节点
130         Node root = nodeList.get(0);
131
132         System.out.println("先序遍历:");
133         preOrderTraverse(root);
134         System.out.println();
135
136         System.out.println("中序遍历:");
137         inOrderTraverse(root);
138         System.out.println();
139
140         System.out.println("后序遍历:");
141         postOrderTraverse(root);
142     }
143
144 }
时间: 2024-10-13 10:26:58

二叉数的遍历的相关文章

Path Sum 2 --java 二叉数 深度遍历,保存路径

在Path SUm 1中(http://www.cnblogs.com/hitkb/p/4242822.html) 我们采用栈的形式保存路径,每当找到符合的叶子节点,就将栈内元素输出.注意存在多条路径的情况. public List<List<Integer>> pathSum(TreeNode root, int sum) { List<List<Integer>>list=new ArrayList<>(); Stack<TreeNod

二叉搜索树的遍历

------------------siwuxie095 二叉搜索树的遍历 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

二叉数的非递归遍历

本文借鉴于:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相

使用非递归函数和递归函数分别实现二叉数的前序丶中序丶后序遍历

最近在复习二叉树的算法,所以对二叉树的遍历分别做了用两中不同方式来实现二叉树遍历 首先是先序遍历 1 /***********************先序遍历**************************/ 2 //先输出当前结点,再输出左结点,再输出右结点 3 4 /// <summary> 5 /// 使用非递归方式实现先序遍历 6 /// </summary> 7 /// <param name="head"></param>

九度 1201 -二叉排序数遍历- 二叉排序树

这个是道正统的树构建和遍历题,一开始还想用数组构建代替一下水过去,但是发现不行,只好老老实实的用指针了.二叉排序树和遍历方法如果不清楚定义的话,最好去看看数据结构书复习下. #include<stdio.h> struct node{ node *l; node *r; int val; node(int a):val(a),l(NULL),r(NULL){}; }; node *root; int n; void qian(node *p){ printf("%d ",p

07_1.二叉数

- 在非空二叉树第i层中至多有2^i个结点(i>=0) 第0层至多有一个根结点 - 高度为h的二叉树至多有(2^(h+1))-1个结点(h>=0) 高度为0只有一个根结点 - 对于任何非空二叉树T,如果其叶结点的个数n0,度数为2的结点个数为n2,那么n0=n2+1 叶结点(没有子结点的结点),度数为2(有左右2个子树) - 满二叉树的叶结点比分支结点(度数不为0的结点)多一个 扩充二叉树: 扩充二叉树:对二叉树T,加入足够多的新叶结点,使T的原结点都变成度数为2的分支结点,得到的二叉树称为T

07_2.二叉数,二叉树的简单应用:表达式树

""" 二叉树的list实现 """ def BinTree(data, left=None, right=None): """ 二叉树 :param data: 根结点的元素 :param left: 左子树元素 :param right: 右子树元素 :return: """ return [data, left, right] def is_empty_BinTree(btree)

二叉数实现方法 很绕的一个方法 递归

//构造类 package com.zw.binary; public class BinaryTree { private Node root; public void add(int data){ if(root==null) { root=new Node(data); } else { root.add(data); } } public void print(){ if(root!=null) { root.print(); } } //内部类 class  Node{ private

3-1复习最短路径算法,3-2学习二叉数结构

第7章,神奇的树. 第一节,树的特点. 第二节,二叉树. 第三节,优先队列--堆(特殊的完全二叉树) 最小堆:All node-father smaller than node-sons 最大堆:相反. 原文地址:https://www.cnblogs.com/chentianwei/p/8492545.html