当前位置:文档之家› 数据结构之二叉树概述

数据结构之二叉树概述

数据结构之二叉树第一篇:数据结构之链表第二篇:数据结构之栈和队列在这篇文章里面,我们主要探讨和树相关的话题。

首先,我们来对树进行定义:树是n(n>= 0)个节点的有限集。

在任何一个非空树中:(1)有且仅有一个特定的称为“根”的节点;(2)当n>1时,其余节点可分为m(m>0)个互相相关的有限集T1、T2、T3……,其中每一个集合本身又是一棵树,并且称为根的子树。

对于我们这篇文章里讨论的二叉树,它是一种特殊的树形结构,每个节点至多只有两颗子树,并且子树有左右之分,其次序不能随意颠倒。

接下来,我们使用java代码来定义一棵树:1public class BinNode {2private int m_Value;3private BinNode m_Left;4private BinNode m_Right;5public void setValue(int m_Value) {6this.m_Value = m_Value;7 }8public int getValue() {9return m_Value;10 }11public void setLeft(BinNode m_Left) {12this.m_Left = m_Left;13 }14public BinNode getLeft() {15return m_Left;16 }17public void setRight(BinNode m_Right) {18this.m_Right = m_Right;19 }20public BinNode getRight() {21return m_Right;22 }2324public boolean isLeaf()25 {26return m_Left == null && m_Right == null;27 }28 }下面,开始讨论和二叉树相关的话题•构造二叉树,给出一个已排序的整型数组,如何根据它来构造一个BST(二叉搜索树)。

思路:二叉搜索树的特点是左子树的值<=父节点的值<=右子树的值。

我们可以从下标0开始遍历数组,然后依次创建树节点,这样下来,对于树的根节点来说,只有右子树,没有左子树,整个树不是平衡二叉树。

为了优化这一点,我们可以将数组的中间元素作为根节点,前半部分的值作为树的左子树,后半部分的值作为树的右子树,然后使用递归依次构建。

1public static BinNode buildTree(int[] arrValue)2 {3if(arrValue == null) return null;4 BinNode root = new BinNode();5 buildTree(arrValue, 0, arrValue.length - 1, root);6return root;7 }89private static void buildTree(int[] arrValue, int startPos, int endPos, BinNode tree)10 {11if (startPos > endPos) return;1213int midPos = startPos + (endPos - startPos)/2;14if (tree == null)15 {16 tree = new BinNode();17 }18 tree.setValue(arrValue[midPos]);1920if (midPos - 1 >= startPos)21 {22 BinNode left = new BinNode();23 tree.setLeft(left);24 buildTree(arrValue, startPos, midPos - 1, left);25 }26if (endPos >= midPos + 1)27 {28 BinNode right = new BinNode();29 tree.setRight(right);30 buildTree(arrValue, midPos + 1, endPos, right);31 }32 }•树的遍历(前序遍历、中序遍历、后序遍历、层次遍历)思路:可以采用递归或者非递归的方式进行遍历前序遍历1public static void preOrder(BinNode tree)2 {3if (tree == null)4 {5return;6 }7 System.out.println(tree.getValue());8 preOrder(tree.getLeft());9 preOrder(tree.getRight());10 }1public static void preOrder2(BinNode tree)2 {3if (tree == null) return;4 Stack stack = new Stack(10);5 BinNode temp = tree;6while(temp != null)7 {8 System.out.println(temp.getValue());9if (temp.getRight() != null)stack.push(temp.getRight());10 temp = temp.getLeft();11 }12while(stack.get_Count() > 0)13 {14 temp = (BinNode)stack.pop();15 System.out.println(temp.getValue());16while(temp != null)17 {18if (temp.getRight() != null)19 {20 stack.push(temp.getRight());21 }22 temp = temp.getLeft();23 }24 }25 }中序遍历1public static void inOrder(BinNode tree)2 {3if (tree == null)4 {5return;6 }7 inOrder(tree.getLeft());8 System.out.println(tree.getValue());9 inOrder(tree.getRight());10 }1public static void inOrder2(BinNode tree)2 {3if (tree == null) return;4 Stack stack = new Stack(10);5 BinNode temp = tree;6while(temp != null)7 {8 stack.push(temp);9 temp = temp.getLeft();10 }11while(stack.get_Count() > 0)12 {13 temp = (BinNode)stack.pop();14 System.out.println(temp.getValue());15if (temp.getRight() != null)16 {17 temp = temp.getRight();18 stack.push(temp);19while(temp != null)20 {21if (temp.getLeft() != null)22 {23 stack.push(temp.getLeft());24 }25 temp = temp.getLeft();26 }27 }28 }29 }后序遍历1public static void postOrder(BinNode tree)2 {3if (tree == null)4 {5return;6 }7 postOrder(tree.getLeft());8 postOrder(tree.getRight());9 System.out.println(tree.getValue());10 }1public static void postOrder2(BinNode tree)2 {3if (tree == null) return;4 Stack stack = new Stack(10);5 BinNode temp = tree;6while(temp != null)7 {8 stack.push(temp);9 temp = temp.getLeft();10 }1112while(stack.get_Count() > 0)13 {14 BinNode lastVisited = temp;15 temp = (BinNode)stack.pop();16if (temp.getRight() == null || temp.getRight() == lastVisited)17 {18 System.out.println(temp.getValue());19 }20else if (temp.getLeft() == lastVisited)21 {22 stack.push(temp);23 temp = temp.getRight();24 stack.push(temp);25while(temp != null)26 {27if (temp.getLeft() != null)28 {29 stack.push(temp.getLeft());30 }31 temp = temp.getLeft();32 }33 }34 }35 }层次遍历1public static void printTree(BinNode tree)2 {3if (tree == null)4 {5return;6 }7 Queue queue = new Queue(10);8 queue.enQueue(tree);9while(queue.get_Count() > 0)10 {11 BinNode temp = (BinNode) queue.deQueue();12 System.out.println(temp.getValue());13if (temp.getLeft() != null)queue.enQueue(temp.getLeft());14if (temp.getRight() != null)queue.enQueue(temp.getRight());15 }16 }•判断二叉树是否是平衡二叉树思路:平衡二叉树的特点是左右子树的深度差不能大于1,采用递归的方式。

相关主题