1. 程式人生 > >二叉樹的幾種遍歷方式

二叉樹的幾種遍歷方式

package com.sys.binarytreetest.binary;

import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;

/**
 * Created by chengjiamei on 2017/8/3.
 */
public class BinaryTree {

    private TreeNode root = null;

    public BinaryTree() {
        root 
= new TreeNode(1,"A"); createBinaryTree(); } /** * Root 的位置 * 前序遍歷 Root Left Right * 中序遍歷 Left Root Right * 後序遍歷 Left Right Root * 構建二叉樹 * A * B C * D E F * G H I J K L
*/ public void createBinaryTree(){ TreeNode nodeB = new TreeNode(2,"B"); TreeNode nodeC = new TreeNode(3,"C"); TreeNode nodeD = new TreeNode(4,"D"); TreeNode nodeE = new TreeNode(5,"E"); TreeNode nodeF = new TreeNode(6,"F"); TreeNode nodeG = new TreeNode(7
,"G"); TreeNode nodeH = new TreeNode(8,"H"); TreeNode nodeI = new TreeNode(9,"I"); TreeNode nodeJ = new TreeNode(10,"J"); TreeNode nodeK = new TreeNode(11,"K"); TreeNode nodeL = new TreeNode(12,"L"); root.leftChild = nodeB; root.rightChild = nodeC; nodeB.leftChild = nodeD; nodeB.rightChild = nodeE; nodeC.rightChild = nodeF; nodeF.leftChild = nodeK; nodeF.rightChild = nodeL; nodeD.leftChild = nodeG; nodeD.rightChild = nodeH; nodeE.leftChild = nodeI; nodeE.rightChild = nodeJ; } public int getHeight() { return getHeight(root); } public int getHeight(TreeNode treeNode) { if(treeNode == null) return 0; int i = getHeight(treeNode.leftChild); int j = getHeight(treeNode.rightChild); return i<j?j+1:i+1; } public int getSize(){ return getSize(root); } public int getSize(TreeNode treeNode) { if(treeNode == null) return 0; return 1+getSize(treeNode.leftChild) + getSize(treeNode.rightChild); } /** * 迭代遍歷 * 前序遍歷 * @param treeNode */ private void preOrder(TreeNode treeNode) { if(treeNode == null) return; System.out.println(treeNode.data); preOrder(treeNode.leftChild); preOrder(treeNode.rightChild); } /** * 棧式 遍歷 * @param node */ private void nonPreOrder(TreeNode node){ if(node == null) return; Stack<TreeNode> stack = new Stack<>(); stack.push(node); while (!stack.isEmpty()) { TreeNode treeNode = stack.pop(); System.out.println(treeNode.data); if(treeNode.rightChild != null) { stack.push(treeNode.rightChild); } if(treeNode.leftChild != null) { stack.push(treeNode.leftChild); } } } /** * 迭代遍歷 * 中序遍歷 * @param treeNode */ private void midOrder(TreeNode treeNode) { if (treeNode == null) return; midOrder(treeNode.leftChild); System.out.println(treeNode.data); midOrder(treeNode.rightChild); } /** * 棧式 遍歷 * 中序遍歷 * @param treeNode */ private void nonMidOrder(TreeNode treeNode) { if(treeNode == null) return; Stack<TreeNode> stack = new Stack<>(); stack.push(treeNode); while (!stack.isEmpty()) { TreeNode node = stack.pop(); TreeNode nodeLeft = node.leftChild; TreeNode nodeRight = node.rightChild; if(nodeRight != null) { stack.push(nodeRight); } if(nodeLeft != null || nodeRight != null){ node.leftChild = null; node.rightChild = null; stack.push(node); } if(nodeLeft != null){ stack.push(nodeLeft); } if(nodeLeft == null && nodeRight == null){ System.out.println(node.data); } } } /** * 迭代遍歷 * 後序遍歷 * @param treeNode */ public void postOrder(TreeNode treeNode) { if(treeNode == null) return; postOrder(treeNode.leftChild); postOrder(treeNode.rightChild); System.out.println(treeNode.data); } /** * 棧式 遍歷 * 後序遍歷 * @param treeNode */ public void nonPostOrder(TreeNode treeNode) { if (treeNode == null) return; Stack<TreeNode> stack = new Stack<>(); stack.push(treeNode); while (!stack.isEmpty()){ TreeNode node = stack.pop(); TreeNode nodeLeft = node.leftChild; TreeNode nodeRight = node.rightChild; if(nodeLeft != null || nodeRight != null){ node.leftChild = null; node.rightChild = null; stack.push(node); } if(nodeRight != null) { stack.push(nodeRight); } if(nodeLeft != null) stack.push(nodeLeft); if(nodeLeft == null && nodeRight == null) { System.out.println(node.data); } } } /** * 層序遍歷 * @param node */ private void cengxuOrder(TreeNode node){ if(node == null) return; int in = 0; int out = 0; ArrayList<TreeNode> list = new ArrayList<>(); list.add(in++,node); while (in>out) { if(list.get(out) != null){ System.out.println(list.get(out).data); if(node.leftChild != null) { list.add(in++, list.get(out).leftChild); } if( node.rightChild != null){ list.add(in++, list.get(out).rightChild); } } out++; } } private List<TreeNode> getList(TreeNode node) { ArrayList<TreeNode> list = new ArrayList<>(); if(node.leftChild != null) { list.add(node.leftChild); } if(node.rightChild != null){ list.add(node.rightChild); } return list; } public class TreeNode { private int index; private String data; private TreeNode leftChild; private TreeNode rightChild; public TreeNode(int index, String data ) { this.index = index; this.data = data; this.leftChild = null; this.rightChild = null; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public String getData() { return data; } public void setData(String data) { this.data = data; } public TreeNode getLeftChild() { return leftChild; } public void setLeftChild(TreeNode leftChild) { this.leftChild = leftChild; } public TreeNode getRightChild() { return rightChild; } public void setRightChild(TreeNode rightChild) { this.rightChild = rightChild; } } public static void main(String[] args) { BinaryTree binaryTree = new BinaryTree(); System.out.print("binary height = "+binaryTree.getHeight()); System.out.println("binary size = "+binaryTree.getSize()); //binaryTree.preOrder(binaryTree.root); //binaryTree.nonPreOrder(binaryTree.root); /*System.out.println(); binaryTree.midOrder(binaryTree.root); System.out.println(); binaryTree.nonMidOrder(binaryTree.root); System.out.println();*/ /*binaryTree.postOrder(binaryTree.root); System.out.println(); binaryTree.nonPostOrder(binaryTree.root); System.out.println();*/ binaryTree.cengxuOrder(binaryTree.root); } }

相關推薦

方式之間的轉換

寫在前面 二叉樹的遍歷方式,基本可以歸結為四種:前序遍歷、中序遍歷、後序遍歷、層次遍歷 先序遍歷順序:根,左兒子,右兒子 中序遍歷順序:左兒子,根,右兒子 後序遍歷順序:左兒子,右兒子,根 層次遍歷順序:根據每一層的順序,由左向右依次輸出 遍歷順序及轉換  &n

方式

二叉樹的遍歷,如果是手工畫圖,還可以使用投影法快速得到遍歷序列。 以下圖二叉樹為例,講解投影法快速得到遍歷序列的過程。 (1)          中序遍歷 中序遍歷就像在無風的情況下,太陽直射

方式及通過兩重構(java實現)

重構方法參考文章【重構二叉樹(Java實現):https://blog.csdn.net/wangbingcsu/article/details/51372695】 文章目錄 二叉樹類 三種遍歷方式 前序遍歷 中序遍歷 後序遍歷

方式的遞迴和迴圈實現

轉載自:http://blog.csdn.net/pi9nc/article/details/13008511 二叉樹是一種非常重要的資料結構,很多其他資料機構都是基於二叉樹的基礎演變過來的。二叉樹有前、中、後三種遍歷方式,因為樹的本身就是用遞迴定義的,因此採用遞迴的方

演算法

<span style="font-size:14px;">/*二叉樹的遍歷*/ #include <iostream> #include <cstring> #include <stack> using namespace

方式的速度差異

同學阿里三面面試官的一道面試題是:二叉樹每個節點都儲存一個整數,想要求所有節點數值之和,哪種遍歷方式最快? 首先定義二叉樹 struct Tree { int val; Tree *left; Tree *right; Tre

方式,先序、中序、後序

二叉樹遍歷方式分為三種:先序,中序和後序。 可以以根節點的位置為參考來記遍歷方式,在第一個為先序,中間為中序,最後為後序; 即:先序: 根左右;中序:左根右;後序:左右根。 借個圖: 每個節點左上角,底部,右上角分別對應先序,中序,後序時的取值點

【圖解資料結構】 一組動畫徹底理解

二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。 在二叉樹的遍歷中存在三種較為常用的遍歷方式:前序遍歷、中序遍歷、後序遍歷。接下來我將嘗試著用三組動畫向讀者詳細的介紹這三種遍歷方式的邏輯思路,希望讓讀者看到任何的二叉樹都能在腦海中快速的勾勒出動畫。

資料結構 筆記:的典型方式

二叉樹是否只有一種遍歷方式(層次遍歷)? 典型的二叉樹遍歷方式 -先序遍歷(Pre-Order Traversal) -中序遍歷(In-Order Traversal) -後序遍歷(Post-Order Traversal) 先序遍歷(Pre-Order Traversal)

Java實現演算法

</pre><p></p><p>參考網上一些資料測試整理了一下二叉樹遍歷的Java實現程式碼。</p>二叉樹三種遍歷方式:先序遍歷、中序遍歷、後序遍歷。<p>首先定義二叉樹類:</p>&l

的各種方式

class TreeNode{ TreeNode root; TreeNode left; TreeNode right; int val; } public class TreeNodeGo{ //深度優先搜尋(先序、中序、後序) public v

3演算法遞迴與非遞迴實現詳解

一, 二叉樹先序遍歷的實現     遞迴實現 void PreOrderTraverse(BiTree T) { if( T ) { VisitF(T->data);//訪問根節點 PreOrderTra

實現

二叉樹是一種非常重要的資料結構,很多其他資料機構都是基於二叉樹的基礎演變過來的。二叉樹有前、中、後三種遍歷方式,因為樹的本身就是用遞迴定義的,因此採用遞迴的方法實現三種遍歷,不僅程式碼簡潔且容易理解,但其開銷也比較大,而若採用非遞迴方法實現三種遍歷,則要用棧來模擬實現

遞迴及非遞迴實現

二叉樹的三種遍歷方式包括: 前序遍歷中序遍歷後序遍歷 三種遍歷的遞迴方法都非常好實現,而且簡單易懂。非遞迴實現也是通過使用棧來模擬遍歷的過程。順便提一句,能用遞迴做的,基本都能用棧來實現。前序遍歷和中序遍歷的非遞迴寫法相對比較簡單,只需要模擬遍歷過程即可。後序遍歷非遞迴寫

(Java)

以前學資料結構的時候是用C學的,現在重新複習一下資料結構裡用的比較多的二叉樹,用Java實現。好啦,廢話不多說啦!! 我們知道二叉樹有三種遍歷方式:前序(根左右)、中序(左根右)、後序(左右根)。每種遍歷方式其實就是一個遞迴呼叫。 步驟: 1、將陣列中的元素賦值給二叉樹(通

的非遞迴思路(JAVASCRIPT)

二叉樹在圖論中是這樣定義的:二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的資訊來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分

非遞迴演算法

1.先序遍歷非遞迴演算法 #define maxsize 100 typedef struct {     Bitree Elem[maxsize];     int top; } SqStack; void PreOrderUnrec(Bitree t) {     SqStack s;     Stack

方式

package com.sys.binarytreetest.binary; import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; import java.

Python實現"的層次||"的一方法

給定一棵二叉樹,返回從上到下按層級順序遍歷結點的值(例如,從葉子節點的層級到根結點的層級) 例如: 二叉樹[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它從下到上按層級順序遍歷的

【Java】整理方式總結

http://www.cnblogs.com/developerY/p/3323264.html BFS和DFS詳解以及java實現 http://sunlujing.iteye.com/blog/1876540 http://www.cnblogs.com/dolphin