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

關於二叉樹的幾種遍歷

import java.util.*;


/*二叉樹遍歷測試,有一點難,前序與後序可以對照著看*/
public class Solution3 {
    /*二叉樹前序遍歷    根左右*/
    public static ArrayList<Integer> testPre(TreeNode root){
        ArrayList<Integer> list=new ArrayList<Integer>();
        Stack<TreeNode> stack=new Stack<TreeNode>();
        if
(root==null){ return list; } stack.push(root); while (!stack.empty()){ TreeNode node=stack.pop(); list.add(node.val); if(node.right!=null){ stack.push(node.right); } if(node.left!=null){ stack
.push(node.left); } } return list; }
 /*後序遍歷   左右根   可以換算成  根右左,利用stack先進後出變成左右根。*/
    public static ArrayList<Integer> testLast(TreeNode root){
        ArrayList<Integer> list=new ArrayList<Integer>();
        Stack<TreeNode> stack=new Stack
<TreeNode>(); Stack<Integer> stack1=new Stack<Integer>(); if(root==null){ return list; } stack.push(root); while (!stack.empty()){ TreeNode node=stack.pop(); stack1.push(node.val); if(node.left!=null){ stack.push(node.left); } if(node.right!=null){ stack.push(node.right); } } while (!stack1.empty()){ int a=stack1.pop(); list.add(a); } return list; }
/*中序二叉樹遍歷     左根右*/
public static ArrayList<Integer> testMid(TreeNode root){
    ArrayList<Integer> list=new ArrayList<Integer>();
    Stack<TreeNode> stack=new Stack<TreeNode>();
    if(root==null){
        return list;
    }
    //邊界條件,全部遍歷完才能結束。
    while (!stack.empty()||root!=null){
        if (root != null) {
            stack.push(root);
            root = root.left;
        }else {
            TreeNode node = stack.pop();
            list.add(node.val);
            root = node.right;
        }
    }
    return list;
}
    /*層級遍歷*/
    public static ArrayList<Integer> testFloor(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        Queue<TreeNode> queue=new ArrayDeque<TreeNode>();
        if(root==null){
            return list;
        }
        queue.offer(root);
        while (!queue.isEmpty()){
            TreeNode node=queue.poll();
            list.add(node.val);
        if (node.left!=null){
            queue.offer(node.left);
        }
        if (node.right!=null){
            queue.offer(node.right);
        }
        }
        return list;
    }



public static void main(String[] args) {
    TreeNode tree=new TreeNode(1);
    tree.left=new TreeNode(2);
    tree.right=new TreeNode(3);
    tree.left.left=new TreeNode(4);
    tree.left.right=new TreeNode(5);
    tree.right.left=new TreeNode(6);
    tree.right.right=new TreeNode(7);
    //遍歷測試
    ArrayList<Integer> l=testPre(tree);
    ArrayList<Integer> l1=testMid(tree);
    ArrayList<Integer> l2=testLast(tree);
    ArrayList<Integer> l3=testFloor(tree);
    for (Integer i : l1) {
        System.out.println(i);
    }

}
}

1

相關推薦

方式之間的轉換

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

演算法

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

方式

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

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

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

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

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

Java實現演算法

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

方式的遞迴和迴圈實現

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

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

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

實現

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

遞迴及非遞迴實現

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

方式的速度差異

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

(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

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

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

Python實現的層次及按層輸出的兩方法

二叉樹的層次遍歷 二叉樹的層次遍歷即從上往下、從左至右依次列印樹的節點。 其思路就是將二叉樹的節點加入佇列,出隊的同時將其非空左右孩子依次入隊,出隊到佇列為空即完成遍歷。 # -*- coding:utf-8 -*- # class TreeNode: #

binary-tree-inorder-traversal——中序

str () init inorder code while urn value public Given a binary tree, return the inordertraversal of its nodes‘ values. For example:Given

3143 的序

namespace 接下來 esp pos oid 節點 post truct 數據 題目描述 Description 求一棵二叉樹的前序遍歷,中序遍歷和後序遍歷 輸入描述 Input Description 第一行一個整數n,表示這棵樹的節點個數。 接下來n行

【LeetCode-面試算法經典-Java實現】【107-Binary Tree Level Order Traversal II(層序II)】

lin -m length ret itl pub util 實現類 markdown 【107-Binary Tree Level Order Traversal II(二叉樹層序遍歷II)】 【LeetCode-面試算法經典-Java實現】【全