数据结构—二叉树BinaryTree
目錄
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计模式—控制反转
- 下一篇: 常见索引结构—二叉搜索树