欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章徹底弄懂Java中二叉樹(shù)

 更新時(shí)間:2022年01月11日 10:56:11   作者:來(lái)學(xué)習(xí)的小張  
二叉樹(shù)是有限個(gè)節(jié)點(diǎn)的集合,這個(gè)集合可以是空集,也可以是一個(gè)根節(jié)點(diǎn)和兩顆不相交的子二叉樹(shù)組成的集合,其中一顆樹(shù)叫根的左子樹(shù),另一顆樹(shù)叫右子樹(shù),這篇文章主要給大家介紹了一篇文章如何徹底弄懂Java中二叉樹(shù)的相關(guān)資料,需要的朋友可以參考下

一、樹(shù)形結(jié)構(gòu)

樹(shù)是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹(shù)是因?yàn)樗雌饋?lái)像一棵倒掛的樹(shù),也就是說(shuō)它是根朝上,而葉朝下的。它具有以下的特點(diǎn):

  • 有一個(gè)特殊的節(jié)點(diǎn),稱為根節(jié)點(diǎn),根節(jié)點(diǎn)沒(méi)有前驅(qū)節(jié)點(diǎn);
  • 除根節(jié)點(diǎn)外,其余節(jié)點(diǎn)被分成M(M > 0)個(gè)互不相交的集合T1、T2、......、Tm,其中每一個(gè)集合 Ti (1 <= i<= m) 又是一棵與樹(shù)類似的子樹(shù)。每棵子樹(shù)的根節(jié)點(diǎn)有且只有一個(gè)前驅(qū),可以有0個(gè)或多個(gè)后繼
  • 樹(shù)是遞歸定義的。

1.1 相關(guān)概念

  • 節(jié)點(diǎn)的度:一個(gè)節(jié)點(diǎn)含有的子樹(shù)的個(gè)數(shù)稱為該節(jié)點(diǎn)的度; 如上圖:A的度為6;
  • 樹(shù)的度:一棵樹(shù)中,最大的節(jié)點(diǎn)的度稱為樹(shù)的度; 如上圖:樹(shù)的度為6;
  • 葉子節(jié)點(diǎn)或終端節(jié)點(diǎn):度為0的節(jié)點(diǎn)稱為葉節(jié)點(diǎn); 如上圖:B、C、H、I…等節(jié)點(diǎn)為葉節(jié)點(diǎn);
  • 雙親節(jié)點(diǎn)或父節(jié)點(diǎn):若一個(gè)節(jié)點(diǎn)含有子節(jié)點(diǎn),則這個(gè)節(jié)點(diǎn)稱為其子節(jié)點(diǎn)的父節(jié)點(diǎn); 如上圖:A是B的父節(jié)點(diǎn);
  • 孩子節(jié)點(diǎn)或子節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)含有的子樹(shù)的根節(jié)點(diǎn)稱為該節(jié)點(diǎn)的子節(jié)點(diǎn); 如上圖:B是A的孩子節(jié)點(diǎn);
  • 根結(jié)點(diǎn):一棵樹(shù)中,沒(méi)有雙親結(jié)點(diǎn)的結(jié)點(diǎn);如上圖:A
  • 節(jié)點(diǎn)的層次:從根開(kāi)始定義起,根為第1層,根的子節(jié)點(diǎn)為第2層,以此類推;
  • 樹(shù)的高度或深度:樹(shù)中節(jié)點(diǎn)的最大層次; 如上圖:樹(shù)的高度為4

以下概念僅做了解即可

  • 非終端節(jié)點(diǎn)或分支節(jié)點(diǎn):度不為0的節(jié)點(diǎn); 如上圖:D、E、F、G...等節(jié)點(diǎn)為分支節(jié)點(diǎn);
  • 兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)互稱為兄弟節(jié)點(diǎn); 如上圖:B、C是兄弟節(jié)點(diǎn);
  • 堂兄弟節(jié)點(diǎn):雙親在同一層的節(jié)點(diǎn)互為堂兄弟;如上圖:H、I互為兄弟節(jié)點(diǎn);
  • 節(jié)點(diǎn)的祖先:從根到該節(jié)點(diǎn)所經(jīng)分支上的所有節(jié)點(diǎn);如上圖:A是所有節(jié)點(diǎn)的祖先;
  • 子孫:以某節(jié)點(diǎn)為根的子樹(shù)中任一節(jié)點(diǎn)都稱為該節(jié)點(diǎn)的子孫。如上圖:所有節(jié)點(diǎn)都是A的子孫;
  • 森林:由m(m>=0)棵互不相交的樹(shù)的集合稱為森林。

1.2樹(shù)的表示形式

樹(shù)結(jié)構(gòu)相對(duì)線性表就比較復(fù)雜了,要存儲(chǔ)表示起來(lái)就比較麻煩了,實(shí)際中樹(shù)有很多種表示方式,如:雙親表示法,孩子表示法、孩子兄弟表示法等等。這里簡(jiǎn)單的了解其中最常用的孩子兄弟表示法

孩子兄弟表示法代碼示例:

class Node {
int value; // 樹(shù)中存儲(chǔ)的數(shù)據(jù)
Node firstChild; // 第一個(gè)孩子引用
Node nextBrother; // 下一個(gè)兄弟引用
}

圖示:

1.3樹(shù)的應(yīng)用:文件系統(tǒng)管理(目錄和文件)

二、二叉樹(shù)

2.1相關(guān)概念

一棵二叉樹(shù)是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹(shù)和右子樹(shù)的二叉樹(shù)組成。

二叉樹(shù)的特點(diǎn)

每個(gè)結(jié)點(diǎn)最多有兩棵子樹(shù),即二叉樹(shù)不存在度大于 2 的結(jié)點(diǎn)。

二叉樹(shù)的子樹(shù)有左右之分,其子樹(shù)的次序不能顛倒,因此二叉樹(shù)是有序樹(shù)。

2.2 二叉樹(shù)的基本形態(tài)

上圖給出了幾種特殊的二叉樹(shù)形態(tài)。

從左往右依次是:空樹(shù)、只有根節(jié)點(diǎn)的二叉樹(shù)、節(jié)點(diǎn)只有左子樹(shù)、節(jié)點(diǎn)只有右

子樹(shù)、節(jié)點(diǎn)的左右子樹(shù)均存在,一般二叉樹(shù)都是由上述基本形態(tài)結(jié)合而形成的。

2.3 兩種特殊的二叉樹(shù)

滿二叉樹(shù): 一個(gè)二叉樹(shù),如果每一個(gè)層的結(jié)點(diǎn)數(shù)都達(dá)到最大值,則這個(gè)二叉樹(shù)就是滿二叉樹(shù)。也就是說(shuō),如果一個(gè)二叉樹(shù)的層數(shù)為K,且結(jié)點(diǎn)總數(shù)是2k-1 ,則它就是滿二叉樹(shù)。

完全二叉樹(shù): 完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹(shù)是由滿二叉樹(shù)而引出來(lái)的。對(duì)于深度為K的,有n個(gè)結(jié)點(diǎn)的二叉樹(shù),當(dāng)且僅當(dāng)其每一個(gè)結(jié)點(diǎn)都與深度為K的滿二叉樹(shù)中編號(hào)從1至n的結(jié)點(diǎn)一一對(duì)應(yīng)時(shí)稱之為完全二叉樹(shù)。(另一種解釋:如果二叉樹(shù)中除去最后一層節(jié)點(diǎn)為滿二叉樹(shù),且最后一層的結(jié)點(diǎn)依次從左到右分布,則此二叉樹(shù)被稱為完全二叉樹(shù)。 )要注意的是滿二叉樹(shù)是一種特殊的完全二叉樹(shù)

完全二叉樹(shù)

非完全二叉樹(shù):

非完全二叉樹(shù)

2.4 二叉樹(shù)的性質(zhì)

  1. 若規(guī)定根節(jié)點(diǎn)的層數(shù)為1,則一棵非空二叉樹(shù)的第i層上最多有2i-1 (i>0)個(gè)結(jié)點(diǎn);
  2. 若規(guī)定只有根節(jié)點(diǎn)的二叉樹(shù)的深度為1,則深度為K的二叉樹(shù)的最大結(jié)點(diǎn)數(shù)是2k-1 (k>=0);
  3. 對(duì)任何一棵二叉樹(shù), 如果其葉結(jié)點(diǎn)個(gè)數(shù)為 n0, 度為2的非葉結(jié)點(diǎn)個(gè)數(shù)為 n2,則有n0=n2+1;
  4. 具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度k為log2(n+1) 上取整;
  5. 對(duì)于具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù),如果按照從上至下從左至右的順序?qū)λ泄?jié)點(diǎn)從0開(kāi)始編號(hào),則對(duì)于序號(hào)為i的結(jié)點(diǎn)有:
  • i>0,雙親序號(hào):(i-1)/2;i=0,i為根節(jié)點(diǎn)編號(hào),無(wú)雙親節(jié)點(diǎn);
  • 2i+1<n,左孩子序號(hào):2i+1,否則無(wú)左孩子;
  • 2i+2<n,右孩子序號(hào):2i+2,否則無(wú)右孩子;

如:假設(shè)一棵完全二叉樹(shù)中總共有1000個(gè)節(jié)點(diǎn),則該二叉樹(shù)中__500___個(gè)葉子節(jié)點(diǎn),__500___個(gè)非葉子節(jié)點(diǎn),__1___個(gè)節(jié)點(diǎn)只有左孩子,__0___個(gè)只有右孩子。

題解:將該二叉樹(shù)節(jié)點(diǎn)縮小100倍,變?yōu)樵撏耆鏄?shù)中總共有10個(gè)節(jié)點(diǎn),由性質(zhì)2可得深度K為:4,前三層共有7個(gè)節(jié)點(diǎn),則最后一層有10-7=3個(gè)節(jié)點(diǎn),由性質(zhì)1的第三層有4個(gè)節(jié)點(diǎn),其中有2個(gè)節(jié)點(diǎn)上面有子節(jié)點(diǎn),剩余2個(gè)為葉子結(jié)點(diǎn),則該二叉樹(shù)共有3+2=5個(gè)葉子結(jié)點(diǎn),擴(kuò)大100倍為500個(gè)葉子結(jié)點(diǎn),則剩余的就位非葉子結(jié)點(diǎn)。有相關(guān)分析可知該二叉樹(shù)有1個(gè)節(jié)點(diǎn)只有左孩子,0個(gè)節(jié)點(diǎn)只有右孩子。

2.5 二叉樹(shù)的存儲(chǔ)

二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)分為:順序存儲(chǔ)和類似于鏈表的鏈?zhǔn)酱鎯?chǔ)

二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)是通過(guò)一個(gè)一個(gè)的節(jié)點(diǎn)引用起來(lái)的,常見(jiàn)的表示方式有二叉和三叉表示方式,具體如下:

// 孩子表示法
class Node {
int val; // 數(shù)據(jù)域
Node left; // 左孩子的引用,常常代表左孩子為根的整棵左子樹(shù)
Node right; // 右孩子的引用,常常代表右孩子為根的整棵右子樹(shù)
}

// 孩子雙親表示法
class Node {
int val; // 數(shù)據(jù)域
Node left; // 左孩子的引用,常常代表左孩子為根的整棵左子樹(shù)
Node right; // 右孩子的引用,常常代表右孩子為根的整棵右子樹(shù)
Node parent; // 當(dāng)前節(jié)點(diǎn)的根節(jié)點(diǎn)
}

2.6 二叉樹(shù)的基本操作

2.6.1二叉樹(shù)的遍歷

遍歷(Traversal)是指沿著某條搜索路線,依次對(duì)樹(shù)中每個(gè)結(jié)點(diǎn)均做一次且僅做一次訪問(wèn)。訪問(wèn)結(jié)點(diǎn)所做的操作依賴于具體的應(yīng)用問(wèn)題(比如:打印節(jié)點(diǎn)內(nèi)容、節(jié)點(diǎn)內(nèi)容加1)。 遍歷是二叉樹(shù)上最重要的操作之一,是二叉樹(shù)上進(jìn)行其它運(yùn)算之基礎(chǔ)。

在遍歷二叉樹(shù)時(shí),如果沒(méi)有進(jìn)行某種約定,每個(gè)人都按照自己的方式遍歷,得出的結(jié)果就比較混亂,如果按照某種規(guī)則進(jìn)行約定,則每個(gè)人對(duì)于同一棵樹(shù)的遍歷結(jié)果肯定是相同的。如果N代表根節(jié)點(diǎn),L代表根節(jié)點(diǎn)的左子樹(shù),R代表根節(jié)點(diǎn)的右子樹(shù),則根據(jù)遍歷根節(jié)點(diǎn)的先后次序有以下遍歷方式:

  • NLR:前序遍歷(Preorder Traversal 亦稱先序遍歷)——訪問(wèn)根結(jié)點(diǎn)—>根的左子樹(shù)—>根的右子樹(shù)。
  • LNR:中序遍歷(Inorder Traversal)——根的左子樹(shù)—>根節(jié)點(diǎn)—>根的右子樹(shù)。
  • LRN:后序遍歷(Postorder Traversal)——根的左子樹(shù)—>根的右子樹(shù)—>根節(jié)點(diǎn)。

由于被訪問(wèn)的結(jié)點(diǎn)必是某子樹(shù)的根,所以N(Node)、L(Left subtree)R(Right subtree)又可解釋為根、根的左子樹(shù)和根的右子樹(shù)。NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和后根遍歷。

如上面這張圖,

其前序遍歷:ABDEHCFG;

中序遍歷:DBEHAFCG;

后序遍歷:DHEBFGCA。

2.6.2 二叉樹(shù)的基本操作

構(gòu)建一顆二叉樹(shù):

代碼示例:

class TreeNode{
    public char val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(char val){
        this.val = val;
    }
 }
public class BinaryTree {
	//創(chuàng)建一個(gè)二叉樹(shù)
    public TreeNode createTree(){
        TreeNode A = new TreeNode('a');
        TreeNode B = new TreeNode('b');
        TreeNode C = new TreeNode('c');
        TreeNode D= new TreeNode('d');
        TreeNode E = new TreeNode('e');
        TreeNode F = new TreeNode('f');
        TreeNode G = new TreeNode('g');
        TreeNode H = new TreeNode('h');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.right = H;
        C.left = F;
        C.right = G;
        return A;
    }

1. 前序遍歷

根–》左–》右

 void preOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val + " ");
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);
    }

測(cè)試代碼:

 public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
        binaryTree.preOrderTraversal(root);//前序遍歷
        }

輸出結(jié)果:

2. 中序遍歷

左–》根–》右

 // 中序遍歷
    void inOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        inOrderTraversal(root.left);
        System.out.print(root.val + " ");
        inOrderTraversal(root.right);
    }

測(cè)試代碼:

public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
         binaryTree.inOrderTraversal(root);//中序遍歷
        }

輸出結(jié)果:

3. 后序遍歷

左–》右–》根

// 后序遍歷
    void postOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        postOrderTraversal(root.left);
        postOrderTraversal(root.right);
        System.out.print(root.val + " ");
    }

測(cè)試代碼:

public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
        binaryTree.postOrderTraversal(root);//后序遍歷
        }

輸出結(jié)果:

4. 遍歷思路-求結(jié)點(diǎn)個(gè)數(shù)

 static int size = 0;//靜態(tài)變量
    void getSize1(TreeNode root){
        if(root == null){
            return;
        }
        size++;
        getSize1(root.left);
        getSize1(root.right);
    }

5. 子問(wèn)題思路-求結(jié)點(diǎn)個(gè)數(shù)

int getSize2(TreeNode root){
        if(root == null){
            return 0;
        }
        return  getSize2(root.left) + getSize2(root.right)+1;
    }

測(cè)試代碼:

 public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
        binaryTree.getSize1(root);
        System.out.println(BinaryTree.size);
        System.out.println("============");
        System.out.println(binaryTree.getSize2(root));
   }

輸出結(jié)果:

6. 遍歷思路-求葉子結(jié)點(diǎn)個(gè)數(shù)

//遍歷這顆二叉樹(shù),只要節(jié)點(diǎn)的左子樹(shù)和右子樹(shù)都是空的,那么就是葉子
    static int leafSize = 0;
    void getLeafSize1(TreeNode root){
        if(root == null){
            return;
        }
        if(root.left == null && root.right == null){
            leafSize++;
        }
        getLeafSize1(root.left);
        getLeafSize1(root.right);
    }

7. 子問(wèn)題思路-求葉子結(jié)點(diǎn)個(gè)數(shù)

//整棵樹(shù)的葉子結(jié)點(diǎn) = 左子樹(shù)葉子 + 右子樹(shù)葉子
    int getLeafSize2(TreeNode root){
        if(root == null){
            return 0;
        }
        if(root.left == null && root.right == null){
            return 1;
        }
        return  getLeafSize2(root.left) + getLeafSize2(root.right);
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
        binaryTree.getLeafSize1(root);
        System.out.println(BinaryTree.leafSize);//遍歷思路-求葉子結(jié)點(diǎn)個(gè)數(shù)
        System.out.println("+++++++++++++");
        //binaryTree.getLeafSize2(root);
        //System.out.println(BinaryTree.leafSize);//子問(wèn)題思路-求葉子結(jié)點(diǎn)個(gè)數(shù)
        System.out.println(binaryTree.getLeafSize2(root));
  }

輸出結(jié)果:

8. 子問(wèn)題思路-求第 k 層結(jié)點(diǎn)個(gè)數(shù)

// 子問(wèn)題思路-求第 k 層結(jié)點(diǎn)個(gè)數(shù)
    int getKLevelSize(TreeNode root,int k){
        if(root == null){
            return 0;
        }
        if(k == 1){
            return 1;
        }
   return getKLevelSize(root.left,k-1) + getKLevelSize(root.right,k - 1);
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
 		System.out.println(binaryTree.getKLevelSize(root,3));
 }

輸出結(jié)果:

9. 獲取二叉樹(shù)的高度

int getHeight(TreeNode root){
        if(root == null){
            return  0;
        }
        int leftTree = getHeight(root.left);
        int rightTree = getHeight(root.right);
        return ((leftTree > rightTree) ? leftTree + 1 : rightTree + 1);
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
 		int hight = binaryTree.getHeight(root);
        System.out.println(hight);
 }

輸出結(jié)果:

10. 查找val所在的節(jié)點(diǎn)

查找 val 所在結(jié)點(diǎn),沒(méi)有找到返回 null;

按照 根 -> 左子樹(shù) -> 右子樹(shù)的順序進(jìn)行查找;

一旦找到,立即返回,不需要繼續(xù)在其他位置查找。

    TreeNode find(TreeNode root, char val){
        if(root == null){
            return null;
        }
        if(root.val == val){
            return root;
        }
       TreeNode ret = find(root.left,val);
        if(ret != null){
            return ret;
        }
        ret = find(root.right,val );
        if(ret != null){
            return ret;
        }
        return null;
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
 		//查找樹(shù)中得指定val值
       TreeNode ret = binaryTree.find(root,'f');//如果沒(méi)有找到則顯示空指針異常
        System.out.println(ret.val);
 }

輸出結(jié)果:

11.二叉樹(shù)的層序遍歷

 // 層序遍歷
    void levelOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
           TreeNode top = queue.poll();
            System.out.print(top.val+" ");
            if(top.left != null){
                queue.offer(top.left);
            }
            if (top.right != null){
                queue.offer(top.right);
            }
        }
        System.out.println();
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
 		binaryTree.levelOrderTraversal(root);//層序遍歷
 }

輸出結(jié)果:

12.判斷一棵樹(shù)是不是完全二叉樹(shù)

// 判斷一棵樹(shù)是不是完全二叉樹(shù)
    boolean isCompleteTree(TreeNode root){
        if(root == null){
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            TreeNode top = queue.poll();//彈出一個(gè)元素
            if(top != null){
                queue.offer(top.left);
                queue.offer(top.right);
            }else{
                break;
            }
        }
        while (!queue.isEmpty()){
            TreeNode cur = queue.peek();
            if (cur == null){
                queue.poll();
            }else {
                //說(shuō)明不是完全二叉樹(shù)
                return false;
            }
        }
        return true;
    }

測(cè)試代碼:

public class test01 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
        //判斷一棵樹(shù)是不是完全二叉樹(shù)
 		System.out.println(binaryTree.isCompleteTree(root)); 
 }

輸出結(jié)果:

13.非遞歸實(shí)現(xiàn)前序遍歷

 //非遞歸實(shí)現(xiàn)
    // 前序遍歷
    void preOrderTraversalNor(TreeNode root) {
        if (root == null) {
            return;
        }
        TreeNode cur = root;
        Stack<TreeNode> stack = new Stack<>();
        while (cur != null || !stack.empty()) {
            while (cur != null) {
                stack.push(cur);
                System.out.print(cur.val + " ");
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }

14.非遞歸實(shí)現(xiàn)中序遍歷

 // 中序遍歷
    void inOrderTraversalNor(TreeNode root){
        if (root == null) {
            return;
        }
        TreeNode cur = root;
        Stack<TreeNode> stack = new Stack<>();
        while (cur != null || !stack.empty()){
            while (cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            System.out.print(top.val + " ");
            cur = top.right;
        }

    }

15.非遞歸實(shí)現(xiàn)后序遍歷

// 后序遍歷非遞歸
    void postOrderTraversalNor(TreeNode root){
        if (root == null) {
            return;
        }
        TreeNode cur = root;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;//用來(lái)指定上一個(gè)被打印過(guò)的元素
        while (cur != null || !stack.empty()){
            while (cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.peek();
            if(cur.right == null || cur.right == pre ){
                TreeNode popNode = stack.pop();
                System.out.print(popNode.val + " ");
                pre = cur;
                cur = null;
            }else {
                cur = cur.right;
            }
        }
    }

測(cè)試代碼:

 public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();
       // binaryTree.preOrderTraversal(root);//前序遍歷
        //System.out.println();
        binaryTree.preOrderTraversalNor(root);//前序遍歷非遞歸
        System.out.println();
        //binaryTree.postOrderTraversal(root);//后序遍歷
        //System.out.println();
        binaryTree.postOrderTraversalNor(root);//后序遍歷非遞歸
        System.out.println();
        //binaryTree.inOrderTraversal(root);//中序遍歷
        //System.out.println();
        binaryTree.inOrderTraversalNor(root);//中序遍歷非遞歸
        System.out.println();
}

輸出結(jié)果:前、后、中

以上。

總結(jié)

到此這篇關(guān)于Java中二叉樹(shù)的文章就介紹到這了,更多相關(guān)Java中二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法示例

    Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法,簡(jiǎn)單講述了雙鏈表的概念,并結(jié)合實(shí)例形式給出了java雙鏈表實(shí)現(xiàn)任意兩個(gè)節(jié)點(diǎn)交換的操作技巧,需要的朋友可以參考下
    2017-11-11
  • Spring中的Aware接口詳細(xì)解析

    Spring中的Aware接口詳細(xì)解析

    這篇文章主要介紹了Spring中的Aware接口詳細(xì)解析,Aware是一個(gè)具有標(biāo)識(shí)作用的超級(jí)接口,具體實(shí)現(xiàn)是有子接口去決定的,但是子接口至少要有一個(gè)帶一個(gè)參數(shù)的且返回是空的方法,需要的朋友可以參考下
    2023-12-12
  • SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn)

    SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java數(shù)組操作的10大方法

    Java數(shù)組操作的10大方法

    下面是精心整理的Java數(shù)組操作的10大方法,大部分代碼都來(lái)自Stack Overflow,需要的朋友可以參考下
    2014-09-09
  • 使用SpringAOP獲取用戶操作日志入庫(kù)

    使用SpringAOP獲取用戶操作日志入庫(kù)

    這篇文章主要介紹了使用SpringAOP獲取用戶操作日志入庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)

    SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)

    本文主要介紹了SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 一篇文章帶你復(fù)習(xí)java知識(shí)點(diǎn)

    一篇文章帶你復(fù)習(xí)java知識(shí)點(diǎn)

    以下簡(jiǎn)單介紹了下我對(duì)于這些java基本知識(shí)點(diǎn)和技術(shù)點(diǎn)的一些看法和心得,這些內(nèi)容都源自于我這些年來(lái)使用java的一些總結(jié),希望能夠給你帶來(lái)幫助
    2021-06-06
  • 使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng)的配置方法

    使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng)的配置方法

    這篇文章主要介紹了使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng)的配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java maven詳細(xì)介紹

    Java maven詳細(xì)介紹

    今天給大家復(fù)習(xí)一下Java基礎(chǔ)知識(shí),簡(jiǎn)單介紹Maven,文中有非常詳細(xì)的解釋,對(duì)Java初學(xué)者很有幫助喲,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • 快速入門HarmonyOS的Java UI框架的教程

    快速入門HarmonyOS的Java UI框架的教程

    這篇文章主要介紹了快速入門HarmonyOS的Java UI框架,本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論