数据结构—二叉树BinaryTree
生活随笔
收集整理的這篇文章主要介紹了
数据结构—二叉树BinaryTree
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1、如何定義一個二叉樹
2、深度優先搜索
3、廣度優先搜索
1、定義一個二叉樹
通過遞歸的方式定義二叉樹,不能直接定義二叉樹,只能定義二叉樹結點。節點類的屬性包括當前節點的值、左子節點、右子節點(子節點的類型也是二叉樹結點類)、構造函數,代碼如下:
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、遍歷—深度優先搜索
深度遍歷(DFS)前序遍歷、中序遍歷、后序遍歷三種策略,三種遍歷順序的區別主要是看根節點的位置。
1)前序遍歷:根節點-左節點-右節點
// 打印前序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結束條件System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.left); // 左dfs(root.right); // 右 }2)中序遍歷?:左節點-根節點-右節點?
// 打印中序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結束條件dfs(root.left); // 左System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.right); // 右 } // 中序遍歷的倒序 void dfs(TreeNode root) {if(root == null) return; //遞歸結束條件dfs(root.right); // 右System.out.println(root.val); // 根:此位置寫其他操作代碼dfs(root.left); // 左 }3)后序遍歷?:左節點-右節點-根節點
// 打印中序遍歷 void dfs(TreeNode root) {if(root == null) return; //遞歸結束條件dfs(root.left); // 左dfs(root.right); // 右System.out.println(root.val); // 根:此位置寫其他操作代碼 }3、遍歷—廣度優先搜索
用廣度優先處理是很直觀的,可以想象成是一把刀橫著切割了每一層,但是深度優先遍歷就不那么直觀了。
我們開下腦洞,把這個二叉樹的樣子調整一下,擺成一個田字形的樣子。田字形的每一層就對應一個 list。
按照深度優先的處理順序,會先訪問節點 1,再訪問節點 2,接著是節點 3。之后是第二列的 4 和 5,最后是第三列的 6。每次遞歸的時候都需要帶一個 index(表示當前的層數),也就對應那個田字格子中的第幾行,如果當前行對應的 list 不存在,就加入一個空 list 進去。
import java.util.*; class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(root==null) {return new ArrayList<List<Integer>>();}//用來存放最終結果List<List<Integer>> res = new ArrayList<List<Integer>>();dfs(1,root,res);return res;}void dfs(int index,TreeNode root, List<List<Integer>> res) {//假設res是[ [1],[2,3] ], index是3,就再插入一個空list放到res中if(res.size()<index) {res.add(new ArrayList<Integer>());}//將當前節點的值加入到res中,index代表當前層,假設index是3,節點值是99//res是[ [1],[2,3] [4] ],加入后res就變為 [ [1],[2,3] [4,99] ]res.get(index-1).add(root.val);//遞歸的處理左子樹,右子樹,同時將層數index+1if(root.left!=null) {dfs(index+1, root.left, res);}if(root.right!=null) {dfs(index+1, root.right, res);}} }4、構造二叉樹
?
總結
以上是生活随笔為你收集整理的数据结构—二叉树BinaryTree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计模式—控制反转
- 下一篇: 常见索引结构—二叉搜索树