之字形打印二叉树

问题最关键的是用了栈和队列两个数据结构。在层次遍历的过程中,同时将节点保存到栈中。

vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    vector<vector<int>> result;
    if(root==NULL)   return result;
    vector<int> tempRes;
    stack<TreeNode *>st;
    queue<TreeNode *>que;
    que.push(root);
    TreeNode *last=root,*temp=root;
    tempRes.push_back(root->val);
    result.push_back(tempRes);
    tempRes.clear();
    while(!que.empty()){
        temp=que.front();
        if(temp->left){
            que.push(temp->left);
            st.push(temp->left);
        }
        if(temp->right){
            que.push(temp->right);
            st.push(temp->right);
        }
        if(temp==last){
            while(!st.empty()){
                TreeNode *t=st.top();
                tempRes.push_back(t->val);
                st.pop();
            }
            if(tempRes.size()>0)
                result.push_back(tempRes);
            last=que.back();
            tempRes.clear();
        }
        que.pop();
    }
    return result;
}
时间: 2024-10-12 13:32:33

之字形打印二叉树的相关文章

剑指:之字形打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 如二叉树: 1 / 2 3 / \ / 4 5 6 7 打印结果为: 1 3 2 4 5 6 7 解法 之字形打印,即先从左到右,后从右到左,借助栈结构实现: 两个辅助栈:一个存放奇数层节点的栈s1,一个存放偶数层节点的栈s2. s1栈中的节点弹出,其节点的 左->右 孩子进s2栈: s2栈中的节点弹出,其节点的 右->左 孩子进s1栈:

《剑指offer》第三十二题III:之字形打印二叉树

// 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, // 其他行以此类推. #include <cstdio> #include "BinaryTree.h" #include <stack> void Print(BinaryTreeNode* pRoot) { //整体思路和前两道题很像,先进先出变后进先出 if

【剑指Offer-举例让抽象问题具体化】面试题32.2:之字形打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 使用两个栈s1,s2:s1用来存储奇数层的节点,s2用来存储偶数层的节点(层数从1开始): 先将根结点压入s1: 当前层是奇数层时,弹出s1中的节点,并将弹出节点的左孩子.右孩子依次压入到s2中,直至s1为空: 当前层是偶数层时,弹出s2中的节点,并将弹出节点的右孩子.左孩子依次压入到s1当中,直至s2为空: 重复前面两步,直至s1,s

AcWing&#160;45.&#160;之字形打印二叉树

地址 https://www.acwing.com/problem/content/description/43/ 题目描述请实现一个函数按照之字形顺序从上向下打印二叉树. 即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 样例 输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / 12 2 / 6 4 输出:[[8], [2, 12], [6, 4]]

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n

59、剑指offer--按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路:通过分析,使用栈进行存储结点 打印1时,将结点2 3 放入栈中,打印3时,将3的左右孩子67分别放入栈中想放入7 再放6. 通过举例分析,对于父结点在偶数行,先放入右子结点.再放入左子结点(栈2),对于父结点在奇数行,先放入左子结点再放入右子结点(栈1).因此使用两个栈进行存储. 使用两个栈的原因,例如2 3 都在栈中,弹出3,需要

按之字形顺序打印二叉树(剑指offer+队栈的应用)

按之字形顺序打印二叉树 参与人数:703时间限制:1秒空间限制:32768K 通过比例:25.31% 最佳记录:0 ms|8552K(  ) 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题意:看测试用例 测试用例: {8,6,10,5,7,9,11} 对应输出应该为: [[8],[10,6],[5,7,9,11]] 思路:用一个布尔量控制从左到右还是从右到左的顺序:先放入栈中,然后把他