剑指Offer(Java实现)按之字形顺序打印二叉树
生活随笔
收集整理的這篇文章主要介紹了
剑指Offer(Java实现)按之字形顺序打印二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
解題思路
方法一:利用兩個棧的輔助空間分別存儲奇數偶數層的節點,然后打印輸出。
方法二:使用鏈表的輔助空間來實現,然后,將結果ArrayList<ArrayList<>>中的偶數位置處的ArrayList<>進行逆序,最后打印輸出。
代碼實現
import java.util.ArrayList; import java.util.Stack;/* public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}} */ public class Solution {public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> res = new ArrayList<>();if (null == pRoot) {return res;}Stack<TreeNode> s1 = new Stack<>();Stack<TreeNode> s2 = new Stack<>();s1.push(pRoot);int level = 1;while (!s1.empty() || !s2.empty()) {if (0 != level % 2) {ArrayList<Integer> nodeList = new ArrayList<>();while (!s1.empty()) {TreeNode node = s1.pop();nodeList.add(node.val);if (null != node.left) {s2.push(node.left);;}if (null != node.right) {s2.push(node.right);}}if (!nodeList.isEmpty()) {res.add(nodeList);level++;}} else {ArrayList<Integer> nodeList = new ArrayList<>();while (!s2.empty()) {TreeNode node = s2.pop();nodeList.add(node.val);if (null != node.right) {s1.push(node.right);;}if (null != node.left) {s1.push(node.left);}}if (!nodeList.isEmpty()) {res.add(nodeList);level++;}}}return res;}}注意:
import java.util.ArrayList; import java.util.Stack;使用 ArrayList、Stack 的數據結構時,需要導入相應的包。
TreeNode node = s1.pop(); if (null != node) {nodeList.add(node.val);s2.push(node.left);s2.push(node.right); }在節點元素出棧的時候,需要進行 null 判斷,因為輸入時并非是完全二叉樹,層次遍歷時,可能存在空節點元素。
而且,此時是將奇數層的節點依次出棧,所以對于下一層偶數層 s2 的輸出而言,需要由左往右進行入棧,
當 s2 出棧時,順序才能為:由右向左。以此循環,直到 s1 與 s2棧中均為空。
總結
以上是生活随笔為你收集整理的剑指Offer(Java实现)按之字形顺序打印二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过Redis实现分布式锁
- 下一篇: 剑指Offer(Java实现)把二叉树打