题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路
我大概是看书看傻了,书上的方法记混了,一会想用栈,一会想先存左子树再存右子树下一层相反,还好最后冷静分析,奇数层顺序遍历,偶数层用栈存。注意一开始传入空指针的情况。。引发段错误。。
Code
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > result;
if(!pRoot) return result;
vector<int> layer;
queue<TreeNode*> q;
stack<int> temps;
int currentLayerCount = 1, nextLayerCount = 0, flag = 0;
q.push(pRoot);
while(!q.empty()) {
TreeNode* currentTreeNode = q.front();
q.pop();
currentLayerCount--;
if(flag) {
temps.push(currentTreeNode->val);
} else {
layer.push_back(currentTreeNode->val);
}
if(currentTreeNode->left) {
q.push(currentTreeNode->left);
nextLayerCount++;
}
if(currentTreeNode->right) {
q.push(currentTreeNode->right);
nextLayerCount++;
}
if(!currentLayerCount) {
currentLayerCount = nextLayerCount;
nextLayerCount = 0;
if(flag) {
while(!temps.empty()) {
layer.push_back(temps.top());
temps.pop();
}
}
result.push_back(layer);
layer.clear();
flag = 1-flag;
}
}
return result;
}
};
- java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >();
if(pRoot != null) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(pRoot);
int currentCount = 1, currentLevel = 0, nextLayerCount = 0;
ArrayList<Integer> layer = new ArrayList<Integer>();
while(queue.size() > 0) {
TreeNode currentNode = queue.peek();
queue.pop();
layer.add(currentNode.val);
currentCount--;
if(currentNode.left != null) {
nextLayerCount++;
queue.add(currentNode.left);
}
if(currentNode.right != null) {
nextLayerCount++;
queue.add(currentNode.right);
}
if(currentCount == 0) {
currentCount = nextLayerCount;
nextLayerCount = 0;
if(currentLevel % 2 == 1) {
Collections.reverse(layer);
}
currentLevel++;
result.add(layer);
layer = new ArrayList<Integer>();
}
}
}
return result;
}
}
总结
- 直接
reverse
好 ArrayList
中随机访问用get(index)
方法,赋值用set(index, value)
方法Collections.reverse(list)
好用