下面是一维数组存储结构示意图
由上面来看这个一维数组存储结构很简单,这里是一颗完全二叉树所以在一维数组里面没有造成内存的浪费。但是如果不是一个完全或者满二叉树的话,并且仍然采取顺序存储结构的话就会造成大量的内存单元浪费,因为我们必须给二叉树添上一些虚构的不存在的结点,这是资源浪费一方面。另一方面是如果这棵二叉树存在大量的插入和删除等操作就会出现运算的不方便,因为我们插入或者删除一个结点就会造成大量的其他结点的移动。所以基于以上等各方面的原因,对于一般的二叉树而言我们都采用的是链式存储结构。
2、链式存储结构
由于在二叉树每个结点都最多有两个孩子,所以一般来说每个链结点都有三个域,分别是左孩子指针域、数据域、右孩子指针域。结构图如下:
3、二叉树的运算
遍历二叉树是二叉树中的一个重要运算,同时也是二叉树其他运算的基础。二叉树的遍历大致可以分为三种遍历方式,主要是根据二叉树的遍历顺序来区分。
访问根结点
按前序遍历根结点的右孩子树
按中序遍历根结点的左孩子树
按中序遍历根结点的右孩子树
后序遍历
按后序遍历根结点的右孩子树[/size]
[size=10.5000pt; font-family: '宋体';]package com.bes.bintree.test;
public class Node {
private Node leftChild ;
private Node rightChild;
private int data;
public Node(){
}
public Node(int data){
this.data = data;
}
public Node getLeftChild() {
return leftChild;
}
public void setLeftChild(Node leftChild) {
this.leftChild = leftChild;
}
public Node getRightChild() {
return rightChild;
}
public void setRightChild(Node rightChild) {
this.rightChild = rightChild;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
package com.bes.bintree.test;
import java.util.Scanner;
public class CreateTree {
static int array[] = {23,10,0,88,0,0,15,0,34,0,0,0};
public static void main(String args[]) {
Node node = null;
Scanner scanner = new Scanner(System.in);
node = createTreeNode(node, scanner);
System.out.println("中序遍历");
inOrder(node);
System.out.println("前序遍历");
preOrder(node);
System.out.println("后序遍历");
postOrder(node);
}
/**
* 构建二叉树
* @param node
* @param scanner
* @return
*/
private static Node createTreeNode(Node node,Scanner scanner) {
int data = scanner.nextInt();
if (data == 0) {
return null;
}else {
node = new Node(data);
node.setLeftChild(createTreeNode(node.getLeftChild(), scanner));
node.setRightChild(createTreeNode(node.getRightChild(),scanner));
}
return node;
}
/**
* 中序遍历
* @param node
*/
private static void inOrder(Node node) {
if (node != null) {
inOrder(node.getLeftChild());
System.out.println(node.getData());
inOrder(node.getRightChild());
}
}
/**
* 前序遍历
* @param node
*/
private static void preOrder(Node node) {
if(node != null) {
System.out.println(node.getData());
preOrder(node.getLeftChild());
preOrder(node.getRightChild());
}
}
/**
* 后序遍历
* @param node
*/
private static void postOrder(Node node) {
if (node != null) {
postOrder(node.getLeftChild());
postOrder(node.getRightChild());
System.out.println(node.getData());
}
}
}
[/size]
[/align]
分享到:
相关推荐
递归先序遍历二叉树: 递归中序遍历二叉树: 递归后序遍历二叉树: 非递归先序遍历二叉树: 非递归中序遍历二叉树: 非递归后序遍历二叉树: 非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单...
java实现创建二叉树,并且遍历二叉树(此处使用递归方式遍历); 创建二叉树的方式有很多,此处使用线性的链表转化成二叉树,链表节点的顺序就是前序遍历的顺序,链表中的null值,代表二叉树左节点或者右节点为null...
非递归中序遍历二叉树
1.建立完全二叉树 2.先序非递归遍历二叉树函数 & 先序递归遍历二叉树验证 3.中序非递归遍历二叉树函数 & 中序递归遍历二叉树验证 4.后序非递归遍历二叉树函数 & 后序递归遍历二叉树验证
数据结构非递归先序、中序、后序遍历二叉树,数据结构非递归先序、中序、后序遍历二叉树
小小学习,C语言数据结构,中序遍历二叉树非递归算法
非递归先序创建二叉树,非递归先序遍历二叉树和递归中序遍历。
先序递归遍历二叉树: a b c 先序非递归遍历二叉树: a b c 中序递归遍历二叉树: b a c 中序非递归遍历二叉树: b a c 后序递归遍历二叉树: b c a 后序非递归遍历二叉树: b c a 二叉树的深度是2 二叉树的结点个数...
遍历二叉树 遍历二叉树的先序、中序和非递归遍历二叉树的六种算法
不用栈 非递归后序遍历二叉树 有mark标志
二叉树的非递归遍历 二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历二叉树的非递归遍历
递归遍历二叉树、c语言以及数据结构均要用到,我还会上传非递归的··
二叉树深度 二叉树前序遍历 递归实现 二种非递归实现 二叉树中序遍历: 递归实现 非递归实现 二叉树后序遍历: 递归实现 非递归实现 二叉树层次遍历 二叉树层次创建,创建方法遵循卡特兰数 ...
二叉树的非递归遍历,使用C++实现二叉树的非递归遍历,对正在学习算法的同学应该挺有帮助的
用递归中序遍历二叉树 用递归中序遍历二叉树
该程序代码实现了二叉树的递归生成创建,递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍历,非递归中序遍历,非递归后序遍历,以及递归层次遍历,递归求度为0,1,2的节点数,非递归求度为0,1,2的节点数。...
(1)输入字符序列,建立二叉链表 (2)中序遍历二叉树:递归 (3)中序遍历二叉树:非递归 (3)二叉树高度
二叉树的递归算法:建立二叉树、遍历二叉树.doc 多多指教
用递归和不递归的先序,中序和后序遍历二叉树。
java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)