1. 程式人生 > >二叉樹,前序,中序,後序遍歷的具體實現

二叉樹,前序,中序,後序遍歷的具體實現

除了二叉樹遍歷的程式碼,以下內容都來自百度百科。基礎好的話請省略。

二叉樹的定義:

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

二叉樹的基本概念

二叉樹是遞迴定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:

(1)空二叉樹——如圖(a);

(2)只有一個根結點的二叉樹——如圖(b);

(3)只有左子樹——如圖(c
); (4)只有右子樹——如圖(d); (5)完全二叉樹——如圖(e)。 注意:儘管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。[1]

這裡寫圖片描述

二叉樹型別【型別不止這些】

(1)完全二叉樹——若設二叉樹的高度為h,

除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,

第h層有葉子結點,

並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
---------------------------------------------------------

(2)滿二叉樹——

除了葉結點外

每一個結點都有左右子葉

且葉子結點都處在最底層

的二叉樹。

--------------------------------------------------------

(3)平衡二叉樹——

平衡二叉樹又被稱為AVL樹(區別於AVL演算法),

它是一棵二叉排序樹,

且具有以下性質:

它是一棵空樹

或它的左右兩個子樹的高度差的絕對值不超過1,

並且左右兩個子樹都是一棵平衡二叉樹。

相關術語


樹的結點:包含一個數據元素及若干指向子樹的分支;

孩子結點:結點的子樹的根稱為該結點的孩子;

雙親結點:B 結點是A 結點的孩子,則A結點是B 結點的雙親;

兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;

祖先結點: 從根到該結點的所經分支上的所有結點子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫

結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;

樹的深度:樹中最大的結點層

結點的度:結點子樹的個數

樹的度: 樹中最大的結點度。

葉子結點:也叫終端結點,是度為 0 的結點;

分枝結點:度不為0的結點;

有序樹:子樹有序的樹,如:家族樹;

無序樹:不考慮子樹的順序;

二叉樹的性質

(1) 在非空二叉樹中,第i層的結點總數不超過  2的(i-1)方, i>=1;

(2) 深度為h的二叉樹最多有2的h次方-1個結點(h>=1),最少有h個結點;

(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,
則N0=N2+1;

(4) 具有n個結點的完全二叉樹的深度為log2 (n+1)

(5)有N個結點的完全二叉樹各結點如果用順序方式儲存,則結點之間有如下關係:

若I為結點編號則 如果I>1,則其父結點的編號為I/2;

如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;

如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。

(6)給定N個節點,能構成h(N)種不同的二叉樹。

h(N)為卡特蘭數的第N項。h(n)=C(2*n,n)/(n+1)。

(7)設有i個枝點,I為所有枝點的道路長度總和,J為葉的道路長度總和J=I+2i

結點

class Node{
    private int v;
    private Node left;
    private Node right;

    public int getV() {
        return v;
    }

    public void setV(int v) {
        this.v = v;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}

前序遍歷

先根節點,然後左子樹,右子樹

Java程式碼:

  public void Preordertraversal(Node node){
        int v = node.getV();
        //遍歷當前結點
        System.out.println(v);
        Node left = node.getLeft();
        //遍歷左子樹
        if(left != null) Preordertraversal(left);
        Node right = node.getRight();
        //遍歷右子樹
        if(right != null) Preordertraversal(right);
    }

中序遍歷

先左子樹,再根節點,右子樹
public void Inordertraversal(Node node) {
        int v = node.getV();
        Node left = node.getLeft();
        Node right = node.getRight();
        //遍歷左子樹
        if(left != null) Inordertraversal(left);
        //遍歷根節點
        System.out.println(v);
        //遍歷右子樹
        if(right != null) Inordertraversal(right);
    }

後序遍歷

右子樹,根節點,左子樹
 public void Postordertraversal(Node node) {
        int v = node.getV();
        Node left = node.getLeft();
        Node right = node.getRight();
        //遍歷右子樹
        if(right != null) Postordertraversal(right);
        //遍歷左子樹
        if(left != null) Postordertraversal(left);
        //遍歷根節點
        System.out.println(v);
    }

相關推薦

假設每個結點的值為單個字元 設計一個演算法將一棵以鏈方式儲存的 b 轉換成對應的順序儲存結構 a。——含具體實現工程

假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——李春葆資料結構第五版第七章,P246,第十題 思路解析: 解:設二叉樹的順序儲存結構型別為SqBTree,先將順序儲存結構a中所有元素置為‘#’(表示空結點)。將b轉

的建立與訪問演算法的設計(三種方法)

二叉樹的建立與訪問演算法的設計(三種遍歷方法) 1、【問題描述】 從鍵盤輸入二叉樹的元素,建立二叉樹,實現二叉樹的遍歷演算法。 【基本要求】 實現以下基本操作: (1)從鍵盤輸入二叉樹的元素,建立二叉樹。 (2)實現二叉樹的先序遍歷演算法。 2、【問題描述】 從鍵盤輸入二叉樹的元素,

基本數學知識,建立及三種遞迴

一.基本知識 1. 數學知識 (1)在二叉樹的第i層上最多有2^(i-1)個節點 (2)深度為k的二叉樹最多有2^(k)-1 個節點 (3)對任意二叉樹,若葉子節點數為n0,度(

java實現的Node節點定義,並手撕8種

最近準備秋招面試,發現二叉樹這種可以無限擴充套件知識點來虐別人的資料結構,很受面試官的青睞。 如果掌握的不好,會直接死在一面哦。 怕嗎?當你原理、思想,內部結構通通明白,分分鐘手撕程式碼的程度,還怕嗎? 本篇文章就從用java的思想和程式從最基本的怎麼將一個in

blog root tac ace bsp else 中序 ret clas 前序遞歸於循環 #include <iostream> #include <stack> using namespace std; struct TreeNode {

的遞迴和非遞迴程式碼-C語言

#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l

輸入某的結果請重建出該(java實現並測試)

假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 package ssp; class TreeNode { int val; TreeNod

。用遞迴和非遞迴實現

#include<iostream> #include<stack> using namespace std; #define MAX 100 typedef struct Tree{ int data; Tree*lchild; Tree*rchild; }

java深度求葉子節點個數層次

import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ public static void main(Stri

輸入重建並返回

function reConstructBinaryTree(pre, vin) { if(pre.length===0||!pre){ return; }

輸入某的結果請重建出該。假設輸入的的結果都不含重複的數字。例如輸入序列{1,2,4,7,3,5,6,8}和序列{4,7,2,1,5

思路:前序遍歷的第一個元素就是根節點,在中序遍歷中找到根節點的位置,根節點前面的元素就二叉樹的左子樹,根節點後面的元素就是二叉樹中的右子樹,在找出左子樹和右子樹的前序遍歷和中序遍歷,然後遞迴呼叫,再找根節點和左子樹、右子樹  /** * Definition for bi

Java資料結構:(遞迴和非遞迴)

嚶嚶嚶,兩個月沒寫部落格了,由於有點忙,今天開始日更部落格。 今天總結一下學習樹的先根,中根,後根。每種兩種方法,遞迴和非遞迴。 先根: 遞迴: 思路:先根遍歷,即第一次遇到的結點就開始列印。先一直遍歷左子樹,直到未空,然後右子樹,直到為空。遞迴下去。 過程:先將1進入方法

構造-輸入輸出

#include<iostream> #include<cstring> using namespace std; #define DataType char typedef struct Node { DataType data; struct Node*

層次(遞迴與非遞迴方式)

以前在學校學過二叉樹的遍歷,工作後基本上沒用到,現在整理下這幾種排序演算法: 1.java的測試方法: package leetcode.TestList; /** * @author zhangyu * @version V1.0 * @ClassName: TreeNode *

已知如何得到它的

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷    N->L->R中序遍歷    L->

計算機技術——已知如何得到它的

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下:前序遍歷    N->L->R中序遍歷    L->N-&

已知構建該

    // 前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} public TreeNode reConstructBinaryTree(int[] pre, int[] in) { if (pre == null || in == null

輸入某的結果重建該

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。   思路:          先序遍歷的第一個元素為根節點,在中序遍歷中找到這個根節點,從而可以將中序遍歷分為左右兩個部分,左邊部分為左子樹的中序遍歷,右

輸入某的結果重建此

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 比如我們知道一二叉

後續遞迴及非遞迴的python實現

在計算機科學裡,樹的遍歷(也稱為樹的搜尋)是圖的遍歷的一種,指的是按照某種規則,不重複地訪問某種樹的所有節點的過程。具體的訪問操作可能是檢查節點的值、更新節點的值等。不同的遍歷方式,其訪問節點的順序是不一樣的。 遍歷的種類 遍歷方式的命名,源於其訪問節點