二叉树遍历二叉树的实现及先序、中序、后序遍历
最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--二叉树遍历
定义
二叉树:在数据结构中,二叉树是每一个节点最多有两个子树的树结构。常通子树被称作为
“左子树”和右子树。二叉树常通被用于现实二叉查找树和二叉堆。
特色
二叉树的每一个节点最多只有两颗子树(不存在度大于2的结点),要需注意的是二叉树的子树
是有阁下之分的,序次不能倒颠。其第i层最多有个结点;深度为k的二叉树最多有
个结点;对于意任一颗二叉树T,如果其叶子结点树为n0,度为2的结点树为n2,则n0=n2 + 2(根结
点除外)。
存储表现
二叉树可以应用数组或者序顺表来表现,种这现实方法更有利于紧凑的存储和更好的拜访
局部性,但是他要需续连的存储空间,在极端的况情下,如果一颗二叉树只有右子树,那么空
间的糟蹋将会异常的严峻。
二叉树还可以应用表链的存储方法来现实,这也是推荐的现实方法。在Java中体具的树节点
的体具表现况情如下:
class TreeNode<T> { private T data; private TreeNode<T> leftNode; private TreeNode<T> rightNode; public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } }
对于二叉树的体具作操笔者不会去具体的现实,感兴趣的是二叉树的遍历方法。
二叉树的遍历
对于二叉树的遍历方法一般分为三种先序、中序、后序三种方法
先序遍历
若二叉树为空,则不行进任何作操:否则
1、拜访根结点。
2、先序方法遍历左子树。
3、先序遍历右子树。
中序遍历
若二叉树为空,则不行进任何作操:否则
1、中序遍历左子树。
2、拜访根结点。
3、中序遍历右子树。
后序遍历
若二叉树为空,则不行进任何作操:否则
1、后序遍历左子树。
2、后序遍历右子树。
3、放问根结点。
遍历的况情如下:
二叉树遍历的码代现实:
package com.kiritor; /** * Java二叉树的现实 以及遍历 * * @author Kiritor */ public class BinaryTree { /** * 出输结点信息*/ public void printNode(TreeNode<String> node) { System.out.print(node.getData()+" "); } /** * 定义结点 * */ class TreeNode<T> { private T data; private TreeNode<T> leftNode; private TreeNode<T> rightNode; public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } public T getData() { return data; } public void setData(T data) { this.data = data; } public TreeNode<T> getLeftNode() { return leftNode; } public void setLeftNode(TreeNode<T> leftNode) { this.leftNode = leftNode; } public TreeNode<T> getRightNode() { return rightNode; } public void setRightNode(TreeNode<T> rightNode) { this.rightNode = rightNode; } } // 初始化二叉树 public TreeNode<String> init() { TreeNode<String> D = new TreeNode<String>("D", null, null); TreeNode<String> H = new TreeNode<String>("H", null, null); TreeNode<String> I = new TreeNode<String>("I", null, null); TreeNode<String> J = new TreeNode<String>("J", null, null); TreeNode<String> P = new TreeNode<String>("P", null, null); TreeNode<String> G = new TreeNode<String>("G", P, null); TreeNode<String> F = new TreeNode<String>("F", null, J); TreeNode<String> E = new TreeNode<String>("E", H, I); TreeNode<String> B = new TreeNode<String>("B", D, E); TreeNode<String> C = new TreeNode<String>("C", F, G); TreeNode<String> A = new TreeNode<String>("A", B, C); return A; } /**先序遍历二叉树 * */ public void xianIterator(TreeNode<String> node) { this.printNode(node); if(node.getLeftNode()!=null) { this.xianIterator(node.getLeftNode()); } if(node.getRightNode()!=null) { this.xianIterator(node.getRightNode()); } } /** * 中序遍历二叉树*/ public void zhongIterator(TreeNode<String> node) { if(node.getLeftNode()!=null) { this.zhongIterator(node.getLeftNode()); } this.printNode(node); if(node.getRightNode()!=null) { this.zhongIterator(node.getRightNode()); } } /**后序遍历二叉树*/ public void houIterator(TreeNode<String> node) { if(node.getLeftNode()!=null) { this.houIterator(node.getLeftNode()); } if(node.getRightNode()!=null) { this.houIterator(node.getRightNode()); } this.printNode(node); } public static void main(String[] args) { BinaryTree binaryTree = new BinaryTree(); TreeNode<String> node = binaryTree.init(); System.out.println("先序遍历的况情"); binaryTree.xianIterator(node); System.out.println("\n中序遍历的况情"); binaryTree.zhongIterator(node); System.out.println("\n后序遍历的况情"); binaryTree.houIterator(node); } }
文章结束给大家分享下程序员的一些笑话语录: 问路
有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”
下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。
热气球上的人说:“你一定是在 IT 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。