二叉樹遍歷 -- JAVA
《漫畫演算法--小灰的演算法之旅》
二叉樹是典型的非線性資料結構,遍歷時候需要把非線性關聯的節點轉換成一個線性序列,以不同的方式進行遍歷,遍歷出的順序也不相同。
常用的遍歷方式是:前序遍歷、中序遍歷、後序遍歷;(個人理解所謂的前序、中序、後序指的是根節點遍歷的順序是前?是中?是後?)
package com.java.array;
public class BinaryTree {
// 前序遍歷
public static void preOrderTraveral(TreeNode node) {
if (node == null) {
return;
}
System.out.println(node.data);
preOrderTraveral(node.leftChild);
preOrderTraveral(node.rightChild);
}
// 後序遍歷
public static void postOrderTraveral(TreeNode node) {
if (node == null) {
return;
}
preOrderTraveral(node.leftChild);
preOrderTraveral(node.rightChild);
System.out.println(node.data);
}
// 中序遍歷
public static void inOrderTraveral(TreeNode node) {
if (node == null) {
return;
}
preOrderTraveral(node.leftChild);
System.out.println(node.data);
preOrderTraveral(node.rightChild);
}
}
class TreeNode {
int data;
TreeNode leftChild;
TreeNode rightChild;
public TreeNode(int data) {
this.data = data;
}
}
上述是採用遞迴的方式進行遍歷。
(1)棧的資料結構進行二叉樹的前序遍歷
/**
* 二叉樹非遞迴的前序遍歷
*
* @param root 根節點
*/
public static void preOrderTraveralWithStack(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode treeNode = root;
while (treeNode != null || !stack.isEmpty()) {
//迭代訪問節點的左孩子,併入棧
while (treeNode != null) {
System.out.println(treeNode.data);
stack.push(treeNode.leftChild);
treeNode = treeNode.leftChild;
}
// 如果節點沒有左孩子,則彈出棧頂節點,訪問節點右孩子
while (!stack.isEmpty()) {
treeNode = stack.pop();
treeNode = treeNode.rightChild;
}
}
}
(2)二叉樹的層序遍歷
/**
* 二叉樹的廣義遍歷
*
* @param root 根節點
*/
public static void levelOrderTraversal(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode treeNode = queue.poll();
System.out.println(treeNode);
if (treeNode.leftChild != null) {
queue.offer(treeNode.leftChild);
}
if (treeNode.rightChild != null) {
queue.offer(treeNode.rightChild);
}
}
}
相關文章
- JAVA遍歷二叉樹Java二叉樹
- 二叉樹---遍歷二叉樹
- 二叉樹遍歷二叉樹
- 從上到下遍歷二叉樹-Java二叉樹Java
- 二叉樹遍歷方法二叉樹
- 二叉樹的遍歷二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 二叉樹的廣度遍歷和深度遍歷()二叉樹
- 完全二叉樹的遍歷二叉樹
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 層序遍歷二叉樹二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- [java]二叉樹構建、遍歷、深度、平衡性Java二叉樹
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- 二叉樹的遍歷實現二叉樹
- 二叉樹的遍歷筆記二叉樹筆記
- 二叉樹的層序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 二叉樹遍歷方法總結二叉樹
- 【練習】二叉樹的遍歷二叉樹
- 二叉樹的建立與遍歷二叉樹
- 二叉樹非遞迴遍歷二叉樹遞迴
- UVA 536 二叉樹的遍歷二叉樹
- 6.14-二叉樹遍歷二叉樹
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹的構建以及遍歷(Java語言描述)二叉樹Java
- 面試中很值得聊的二叉樹遍歷方法——Morris遍歷面試二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 二叉樹的遍歷 (迭代法)二叉樹