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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构—二叉树BinaryTree

發(fā)布時間:2024/4/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构—二叉树BinaryTree 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1、如何定義一個二叉樹

2、深度優(yōu)先搜索

3、廣度優(yōu)先搜索


1、定義一個二叉樹

通過遞歸的方式定義二叉樹,不能直接定義二叉樹,只能定義二叉樹結(jié)點(diǎn)。節(jié)點(diǎn)類的屬性包括當(dāng)前節(jié)點(diǎn)的值、左子節(jié)點(diǎn)、右子節(jié)點(diǎn)(子節(jié)點(diǎn)的類型也是二叉樹結(jié)點(diǎn)類)、構(gòu)造函數(shù),代碼如下:

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;} }

2、遍歷—深度優(yōu)先搜索

深度遍歷(DFS)前序遍歷、中序遍歷、后序遍歷三種策略,三種遍歷順序的區(qū)別主要是看根節(jié)點(diǎn)的位置。

1)前序遍歷:根節(jié)點(diǎn)-左節(jié)點(diǎn)-右節(jié)點(diǎn)

// 打印前序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結(jié)束條件System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.left); // 左dfs(root.right); // 右 }

2)中序遍歷?:左節(jié)點(diǎn)-根節(jié)點(diǎn)-右節(jié)點(diǎn)?

// 打印中序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結(jié)束條件dfs(root.left); // 左System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.right); // 右 } // 中序遍歷的倒序 void dfs(TreeNode root) {if(root == null) return; //遞歸結(jié)束條件dfs(root.right); // 右System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.left); // 左 }

3)后序遍歷?:左節(jié)點(diǎn)-右節(jié)點(diǎn)-根節(jié)點(diǎn)

// 打印中序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結(jié)束條件dfs(root.left); // 左dfs(root.right); // 右System.out.println(root.val); // 根:此位置寫其他操作代碼 }

3、遍歷—廣度優(yōu)先搜索

用廣度優(yōu)先處理是很直觀的,可以想象成是一把刀橫著切割了每一層,但是深度優(yōu)先遍歷就不那么直觀了。

我們開下腦洞,把這個二叉樹的樣子調(diào)整一下,擺成一個田字形的樣子。田字形的每一層就對應(yīng)一個 list。

按照深度優(yōu)先的處理順序,會先訪問節(jié)點(diǎn) 1,再訪問節(jié)點(diǎn) 2,接著是節(jié)點(diǎn) 3。之后是第二列的 4 和 5,最后是第三列的 6。每次遞歸的時候都需要帶一個 index(表示當(dāng)前的層數(shù)),也就對應(yīng)那個田字格子中的第幾行,如果當(dāng)前行對應(yīng)的 list 不存在,就加入一個空 list 進(jìn)去。

import java.util.*; class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(root==null) {return new ArrayList<List<Integer>>();}//用來存放最終結(jié)果List<List<Integer>> res = new ArrayList<List<Integer>>();dfs(1,root,res);return res;}void dfs(int index,TreeNode root, List<List<Integer>> res) {//假設(shè)res是[ [1],[2,3] ], index是3,就再插入一個空list放到res中if(res.size()<index) {res.add(new ArrayList<Integer>());}//將當(dāng)前節(jié)點(diǎn)的值加入到res中,index代表當(dāng)前層,假設(shè)index是3,節(jié)點(diǎn)值是99//res是[ [1],[2,3] [4] ],加入后res就變?yōu)?[ [1],[2,3] [4,99] ]res.get(index-1).add(root.val);//遞歸的處理左子樹,右子樹,同時將層數(shù)index+1if(root.left!=null) {dfs(index+1, root.left, res);}if(root.right!=null) {dfs(index+1, root.right, res);}} }

4、構(gòu)造二叉樹

?

總結(jié)

以上是生活随笔為你收集整理的数据结构—二叉树BinaryTree的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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