日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常考数据结构与算法:二叉树的之字形层序遍历

發布時間:2025/6/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常考数据结构与算法:二叉树的之字形层序遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

給定一個二叉樹,返回該二叉樹的之字形層序遍歷,(第一層從左向右,下一層從右向左,一直這樣交替)
例如:
給定的二叉樹是{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); // } // }}

?

?

?

總結

以上是生活随笔為你收集整理的常考数据结构与算法:二叉树的之字形层序遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。