• 37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal


    Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

    For example: Given binary tree {3,9,20,#,#,15,7},

        3
       / 
      9  20
        /  
       15   7
    

    return its zigzag level order traversal as:

    [
      [3],
      [20,9],
      [15,7]
    ]
    

    思路: 使用两个队列(一个可以顺序读,所以用vector模拟),每个队列放一层结点。

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    void getQue1(vector<TreeNode*> &q1, queue<TreeNode*> &q2, vector<vector<int> > &vec) {
        while(!q2.empty()) {
            TreeNode *p = q2.front();
            q2.pop();
            if(p->left) q1.push_back(p->left);
            if(p->right) q1.push_back(p->right);
        }
        if(q1.size() == 0) return;
        vector<int> vec2;
        for(int i = q1.size()-1; i >= 0; --i)
            vec2.push_back(q1[i]->val);
        vec.push_back(vec2);
    }
    void getQue2(queue<TreeNode*> &q2, vector<TreeNode*> &q1, vector<vector<int> > &vec) {
        if(q1.size() == 0) return;
        vector<int> vec2;
        for(int i = 0; i < q1.size(); ++i) {
            if(q1[i]->left) { q2.push(q1[i]->left); vec2.push_back(q1[i]->left->val); } 
            if(q1[i]->right) { q2.push(q1[i]->right); vec2.push_back(q1[i]->right->val); }
        }
        if(vec2.size()) vec.push_back(vec2);
        q1.clear();
    }
    class Solution {
    public:
        vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
            vector<vector<int> > vec;
            if(root == NULL) return vec;
            queue<TreeNode*> q2;
            vector<TreeNode*> q1;
            q2.push(root);
            vec.push_back(vector<int>(1, root->val));
            while(!q2.empty()) {
                getQue1(q1, q2, vec);
                getQue2(q2, q1, vec);
            }
            return vec;
        }
    };
    

    Binary Tree Inorder Traversal

    OJ: https://oj.leetcode.com/problems/binary-tree-inorder-traversal/

    Given a binary tree, return the inorder traversal of its nodes' values.

    For example: Given binary tree {1,#,2,3},

       1
        
         2
        /
       3
    

    return [1,3,2].

    Note: Recursive solution is trivial, could you do it iteratively?

    题解: 两种方法: 1. 使用栈:  O(n) Time, O(n) Space。 2. Morris traversal (构造线索树), O(n) Time, O(1) Space.

    1. 使用栈

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode *root) {
            vector<int> vec;
            if(root == NULL) return vec;
            TreeNode *p = root;
            stack<TreeNode *> st;
            st.push(p);
            while(p->left) { p = p->left; st.push(p); }
            while(!st.empty()) {
                TreeNode *q = st.top();
                st.pop();
                vec.push_back(q->val);
                if(q->right) { 
                    q = q->right; st.push(q); 
                    while(q->left) { q = q->left; st.push(q); }
                }
            }
            return vec;
        }
    };
    

     2. Morris Traversal

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    	vector<int> inorderTraversal(TreeNode *root) {
    		vector<int> vec;
    		TreeNode *cur, *pre;
    		cur = root;
    		while(cur) {
    			if(cur->left == NULL) {
    				vec.push_back(cur->val);
    				cur = cur->right;
    			} else {
    				pre = cur->left;
    				while(pre->right && pre->right != cur) pre = pre->right;
    				if(pre->right == NULL) {
    					pre->right = cur;
    					cur = cur->left;
    				} else {
    					pre->right = NULL;
    					vec.push_back(cur->val);
    					cur = cur->right;
    				}
    			}
    		}
    		return vec;
    	}
    };
    
  • 相关阅读:
    字典的创建以及操作
    对列表的操作
    python中列表中元素的增删改查
    pycharm中代码整体缩进
    pycharm的简介
    break,continue的区别
    python_字符串的格式化输出
    Zabbix安装图解教程
    性能瓶颈定位整体思路
    数据库监控的指标
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3940117.html
Copyright © 2020-2023  润新知