您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java二叉樹有哪幾種遍歷”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java二叉樹有哪幾種遍歷”吧!
一、先序遍歷與后序遍歷
二、中序遍歷
三、層序遍歷
先序遍歷根節點,再遍歷左子樹,再遍歷右子樹。
后序遍歷先遍歷左子樹,再遍歷右子樹,再遍歷根節點。
先序遍歷遞歸實現:
public static void preOrderByRecursion(TreeNode root) { // 打印節點值 System.out.println(root.value); preOrder(root.left); preOrder(root.right); }
先序遍歷的非遞歸實現:
非遞歸實現需要借助棧這樣一個數據結構,實際上遞歸實現也是依靠棧,只不過是隱式的。
先將根節點壓入棧中。
彈出棧中的節點,將彈出節點的右子節點壓入棧中,再將彈出節點的左子樹壓入棧中。
重復步驟2,直到棧為空。
public static void preOrder(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); // 打印節點值 System.out.print(node.value + " "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } }
后序遍歷遞歸實現:先序遍歷反過來,就不贅述了。
public static void postOrderByRecursion(TreeNode root) { postOrderByRecursion(root.left); postOrderByRecursion(root.right); System.out.println(root.value); }
后序遍歷非遞歸實現:后序遍歷就是先序遍歷反過來,所以需要兩個棧,多出來的棧用來反向輸出。
public static void postOrder(TreeNode root) { if (root == null) { return; } Stack<TreeNode> s1 = new Stack<>(); Stack<TreeNode> s2 = new Stack<>(); s1.push(root); while (!s1.empty()) { TreeNode node = s1.pop(); s2.push(node); if (node.left != null) { s1.push(node.left); } if (node.right != null) { s1.push(node.right); } } while (!s2.empty()) { System.out.println(s2.pop().value); } }
中序遍歷先遍歷左子樹,再遍歷根節點,再遍歷右子樹。
遞歸遍歷:
public static void inOrderByRecursion(TreeNode root) { if (root == null) { return; } inOrderByRecursion(root.left); // 打印節點值 System.out.println(root.value); inOrderByRecursion(root.right); }
非遞歸遍歷:
將二叉樹的左側“邊”從上到下依次壓入棧中。
從棧中彈出節點
對以彈出節點的右子節點為根節點的子樹,重復步驟1。
重復2、3步驟,直到棧為空。
public static void inOrder(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); TreeNode cur = root; while (cur != null) { stack.push(cur); cur = cur.left; } while (!stack.empty()) { TreeNode node = stack.pop(); System.out.println(node.value); cur = node.right; while (cur != null) { stack.push(cur); cur = cur.left; } } }
層序遍歷顧名思義就是一層一層,從左到右的遍歷二叉樹。需要用到隊列這一數據結構。
將根節點推入隊列。
從隊列中取出一個節點。
先將取出節點的左子節點推入隊列,再將取出節點的右子節點推入隊列。
重復2、3步驟直到隊列中無節點可取。
public static void floorOrder(TreeNode root) { if (root == null) { return; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.println(node.value); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } }
感謝各位的閱讀,以上就是“Java二叉樹有哪幾種遍歷”的內容了,經過本文的學習后,相信大家對Java二叉樹有哪幾種遍歷這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。