常考数据结构与算法:二叉树的之字形层序遍历
生活随笔
收集整理的這篇文章主要介紹了
常考数据结构与算法:二叉树的之字形层序遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定一個二叉樹,返回該二叉樹的之字形層序遍歷,(第一層從左向右,下一層從右向左,一直這樣交替)
例如:
給定的二叉樹是{3,9,20,#,#,15,7},
該二叉樹之字形層序遍歷的結果是
[
[3],
[20,9],
[15,7]
]
示例1
輸入
{1,#,2}返回值
[[1],[2]]?
? ?二叉樹遍歷,腦海中立刻想到的就是深度優先遍歷和廣度優先遍歷,這兩種方式相信大家都駕輕就熟了,就不再過多累贅。
import java.util.ArrayList; import java.util.Stack;public class ZigzagLevelOrderMe {public static void main(String[]args){//System.out.println("Hello Wolrd!");TreeNode root=new TreeNode(3);root.left=new TreeNode(9);root.right=new TreeNode(20);root.right.left=new TreeNode(15);root.right.right=new TreeNode(7);ZigzagLevelOrderMe s=new ZigzagLevelOrderMe();System.out.println(s.zigzagLevelOrder(root));//s.loop(root);}/* 思路一用棧實現設兩個棧,s2存放奇數層,s1存放偶數層遍歷s2節點的同時按照左子樹、右子樹的順序加入s1,遍歷s1節點的同時按照右子樹、左子樹的順序加入s2*/public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>();if(root==null)return arr;Stack<TreeNode> stack1 = new Stack();Stack<TreeNode> stack2 = new Stack();boolean isLeftToRight = true;stack1.push(root);while(!stack1.isEmpty() || !stack2.isEmpty()){ArrayList<Integer> temp = new ArrayList<>();if(isLeftToRight){while(!stack1.isEmpty()){TreeNode node = stack1.pop();temp.add(node.val);if(node.left != null){stack2.push(node.left);}if(node.right != null){stack2.push(node.right);}}}else{while(!stack2.isEmpty()){TreeNode node = stack2.pop();temp.add(node.val);if(node.right != null){stack1.push(node.right);}if(node.left != null){stack1.push(node.left);}}}if(!temp.isEmpty()){arr.add(temp);}isLeftToRight = !isLeftToRight;}return arr;}// 思路二// 第一層從左向右,下一層從右向左,一直這樣交替//遞歸版實現二叉樹的層次遍歷(之字形遍歷)public void zigzagLevelHelper2(TreeNode root,int level, ArrayList<ArrayList<Integer>> arr){if(root==null)return ;if(level==arr.size()){ArrayList<Integer>newlevelResult=new ArrayList<>();if(level%2==0) //偶數層newlevelResult.add(root.val);else //奇數層newlevelResult.add(0,root.val);arr.add(newlevelResult);}else{ArrayList<Integer>levelResult=arr.get(level);if(level%2==0)levelResult.add(root.val);elselevelResult.add(0,root.val);arr.set(level,levelResult);}//遞歸遍歷左右節點zigzagLevelHelper2(root.left,level+1,arr);zigzagLevelHelper2(root.right,level+1,arr);}/*用棧實現設兩個棧,s2存放奇數層,s1存放偶數層遍歷s2節點的同時按照左子樹、右子樹的順序加入s1,遍歷s1節點的同時按照右子樹、左子樹的順序加入s2*/ // public void loop(TreeNode root) { // if (root == null) return; // // ArrayList<TreeNode> res = new ArrayList<>(); // // Stack<TreeNode> stack1 = new Stack<>(); // Stack<TreeNode> stack2 = new Stack<>(); // boolean left2Right = true; // // stack1.push(root); // // while (!stack1.isEmpty() || !stack2.isEmpty()) { // // 從左向右 // if (left2Right) { // // while (!stack1.isEmpty()) { // TreeNode node = stack1.pop(); // res.add(node); // if (node.left != null) { // stack2.push(node.left); // } // if (node.right != null) { // stack2.push(node.right); // } // } // // 從右向左 // } else { // while (!stack2.isEmpty()) { // TreeNode node = stack2.pop(); // res.add(node); // if (node.right != null) { // stack1.push(node.right); // } // if (node.left != null) { // stack1.push(node.left); // } // } // } // // left2Right = !left2Right; // } // // for (TreeNode node : res) { // System.out.println("" + node.val); // } // }}?
?
?
總結
以上是生活随笔為你收集整理的常考数据结构与算法:二叉树的之字形层序遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webserver通信过程
- 下一篇: 常考数据结构与算法:子数组中的最大累加和