日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】

發(fā)布時間:2024/10/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 💌1.何謂樹
    • 💙 1.1.樹的定義
    • 💙 1.2.樹的特點(diǎn)
    • 💙 1.3.樹的基本術(shù)語
  • 💌2.認(rèn)識二叉樹
    • 🔥 1.1.二叉樹的定義
    • 🔥 1.2.二叉樹的分類
      • 💦 1.2.1.滿二叉樹
      • 💦 1.2.2.完全二叉樹
      • 💦 1.2.3.平衡二叉樹
  • 💌3.二叉樹的遍歷
    • 🔥 3.1.前序遍歷
    • 🔥 3.2.中序遍歷
    • 🔥 3.3.后序遍歷
  • 💌4.二叉樹節(jié)點(diǎn)的查找
    • 🔥 4.1.前序查找
    • 🔥 4.2.中序查找
    • 🔥 4.3.后序查找
  • 💌5.二叉樹節(jié)點(diǎn)的刪除


💌1.何謂樹

💙 1.1.樹的定義

樹是一種數(shù)據(jù)結(jié)構(gòu),它是由n(n>=1)個有限節(jié)點(diǎn)組成一個具有層次關(guān)系的集合。

💙 1.2.樹的特點(diǎn)

(1)每個節(jié)點(diǎn)有零個或多個子節(jié)點(diǎn);
(2) 沒有父節(jié)點(diǎn)的節(jié)點(diǎn)稱為根節(jié)點(diǎn);
(3) 每一個非根節(jié)點(diǎn)有且只有一個父節(jié)點(diǎn);
(4) 除了根節(jié)點(diǎn)外,每個子節(jié)點(diǎn)可以分為多個不相交的子樹。

💙 1.3.樹的基本術(shù)語

結(jié)點(diǎn)的度:結(jié)點(diǎn)擁有的子樹的數(shù)目。
葉子節(jié)點(diǎn):度為零的結(jié)點(diǎn)。
樹的度:樹中結(jié)點(diǎn)的最大的度。
樹的層次:根結(jié)點(diǎn)的層次為1,其余結(jié)點(diǎn)的層次等于該結(jié)點(diǎn)的雙親結(jié)點(diǎn)的層次加1。
樹的高度:樹中結(jié)點(diǎn)的最大層次。
無序樹:如果樹中結(jié)點(diǎn)的各子樹之間的次序是不重要的,可以交換位置。
有序樹:如果樹中結(jié)點(diǎn)的各子樹之間的次序是重要的, 不可以交換位置。



💌2.認(rèn)識二叉樹

🔥 1.1.二叉樹的定義

二叉樹是每個節(jié)點(diǎn)最多有兩個子樹的樹結(jié)構(gòu)。它有五種基本形態(tài):二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。

🔥 1.2.二叉樹的分類

💦 1.2.1.滿二叉樹

除了葉子節(jié)點(diǎn)之外,其他所有的節(jié)點(diǎn)都必須包含左子節(jié)點(diǎn)和右子節(jié)點(diǎn)

💦 1.2.2.完全二叉樹

對于n層的二叉樹,它的n-1層的節(jié)點(diǎn)個數(shù)必須達(dá)到最大值。第n層包含葉子節(jié)點(diǎn),并且葉子節(jié)點(diǎn)從左到右依次排列

💦 1.2.3.平衡二叉樹

它的任意節(jié)點(diǎn)的左右子樹的高度差的絕對值不超過1



💌3.二叉樹的遍歷

🔥 3.1.前序遍歷

//前序遍歷 根->左—>右public void preOrder(TreeNode temp) {if (temp == null) { //遞歸結(jié)束條件return;}System.out.println(temp);preOrder(temp.getLeft());preOrder(temp.getRight());}

🔥 3.2.中序遍歷

//中序遍歷 左->根->右public void infixOrder(TreeNode temp) {if (temp == null) {return;}preOrder(temp.getLeft());System.out.println(temp);preOrder(temp.getRight());}

🔥 3.3.后序遍歷


//后序遍歷 左->右->根public void sufOrder(TreeNode temp) {if (temp == null) {return;}preOrder(temp.getLeft());preOrder(temp.getRight());System.out.println(temp);}

💌4.二叉樹節(jié)點(diǎn)的查找

以前序遍歷為例
一直遞歸下去,如果找到了進(jìn)行返回即可。然后用resultNode進(jìn)行接收,直接返回

🔥 4.1.前序查找

/*** 前序查找* @param temp 節(jié)點(diǎn)* @param no 帶查詢id* @return 查詢到的*/public TreeNode preSearch(TreeNode temp, int no) {if (temp == null) {return null;}if (temp.id == no) { //說明找到了,直接返回return temp;}TreeNode resultNode = null;if (temp.getLeft() != null) {resultNode = preSearch(temp.getLeft(), no);}if (resultNode != null) {return resultNode; //如果找到,直接返回,就不用再執(zhí)行下面的right}if (temp.getRight() != null) {resultNode = preSearch(temp.getRight(), no);}return resultNode;}

🔥 4.2.中序查找

/*** 中序查找* @param cur 節(jié)點(diǎn)* @param no 帶查詢id* @return 查詢到的*/public TreeNode infixSearch(TreeNode cur, int no) {if (cur == null) {return null;}TreeNode resultNode = null;if (cur.getLeft() != null) {resultNode = infixSearch(cur.getLeft(), no);}if (resultNode != null) {return resultNode;}if (cur.id == no) {return cur;}if (cur.getRight() != null) {resultNode = infixSearch(cur.getRight(), no);}return resultNode;}

🔥 4.3.后序查找

/*** 后序查找* @param last 節(jié)點(diǎn)* @param no 帶查詢id* @return 查詢到的*/public TreeNode sufSearch(TreeNode last, int no) {if (last == null) {return null;}TreeNode resultNode = null;if (last.getLeft() != null) {resultNode = sufSearch(last.getRight(), no);}if (resultNode != null) {return resultNode;}if (last.getRight() != null) {resultNode = sufSearch(last.getRight(), no);}if (last.id == no) {resultNode = last;}return resultNode;}

💌5.二叉樹節(jié)點(diǎn)的刪除

💥刪除時如果不是葉子節(jié)點(diǎn)需要將整個子樹一塊刪除

這里需要注解的是結(jié)束條件,有兩種情況(以左為例子)

1.一直往下遞歸,沒有找到該節(jié)點(diǎn),直接返回即可
2.head.getLeft().id == no,說明它的左子節(jié)點(diǎn)是需要進(jìn)行刪除

/*** 如果是葉子節(jié)點(diǎn),則將葉子節(jié)點(diǎn)刪除即可* 如果不是葉子節(jié)點(diǎn),則需要將相關(guān)的子樹都刪除* @param no id*/public void deleteTreeNode(TreeNode head, int no) {if (head.getLeft() == null || head.getLeft().id == no) {head.setLeft(null);return;} else if (head.getRight() == null || head.getRight().id == no) {head.setRight(null);return;}deleteTreeNode(head.getLeft(), no);deleteTreeNode(head.getRight(), no);}

總結(jié)

以上是生活随笔為你收集整理的【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。