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;
	}
};
时间: 2024-08-05 07:05:03

37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal的相关文章

Binary Tree ZigZag Level Order Traversal leetcode java

题目: 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

Binary Tree Zigzag Level Order Traversal

原题: 题目解析:这个问题的实质是要我们按成访问二叉树的结点,并返回每层访问的结果,这里要求走Z字,其实就是一行正向一行反向. /* the kernel idea is visit a binary search tree in level and the additional work we have to label the end of one level. */ vector<vector<int> > zigzagLevelOrder(TreeNode *root) {

39.2: Binary Tree Zigzag Level Order Traversal

/************************************************************************/        /*       38:      Binary Tree Zigzag Level Order Traversal                                       */        /************************************************************

leetcode 刷题之路 63 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 zig

[leetcode]Binary Tree Zigzag Level Order 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,#

[Lintcode]Binary Tree Zigzag Level Order 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). Example Given binary tree {3,9,20,#,#,1

leetcode -day24 Maximum Depth of Binary Tree &amp; Binary Tree Zigzag Level Order Traversal

1.Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. class Solution { public: int maxDepth(TreeNode *root) { inM

[LeetCode] Binary Tree Zigzag Level Order Traversal(bfs)

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 zig

[leetcode]Binary Tree Zigzag Level Order Traversal @ Python

原题地址:http://oj.leetcode.com/problems/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