Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def decorateRecord(self, root: Optional[TreeNode]) -> List[List[int]]:
q = collections.deque()
res = list()
if not root:
return res
q.append(root)
while q:
size = len(q)
tmp = list()
for i in range(size):
node = q.popleft()
tmp.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
res.append(tmp.copy())
return res
方案1:分行打印,使用两个LinkedList
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> decorateRecord(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (Objects.isNull(root)) {
return res;
}
List<TreeNode> tmp1 = new LinkedList<>();
List<TreeNode> tmp2 = new LinkedList<>();
List<Integer> valList = new ArrayList<>();
tmp1.add(root);
while (tmp1.size() > 0) {
TreeNode topNode = tmp1.remove(0);
valList.add(topNode.val);
if (!Objects.isNull(topNode.left)) {
tmp2.add(topNode.left);
}
if (!Objects.isNull(topNode.right)) {
tmp2.add(topNode.right);
}
if (tmp1.size() == 0) {
res.add(new ArrayList<>(valList));
tmp1 = new ArrayList<>(tmp2);
valList.clear();
tmp2.clear();
}
}
return res;
}
}
##Solution1:
20180911重做。经典题目。牢记做法!
/*
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) {
if (!pRoot) return {};
vector<vector<int> > res;
vector<int> tmp_vec;
queue<TreeNode* > tree_que;
tree_que.push(pRoot);
int cur = 1, next = 0;
while (!tree_que.empty()) {
TreeNode *tmp_node = tree_que.front();
tree_que.pop();
cur--;
tmp_vec.push_back(tmp_node->val);
if (tmp_node->left) {
tree_que.push(tmp_node->left);
next++;
}
if (tmp_node->right) {
tree_que.push(tmp_node->right);
next++;
}
if (!cur) {
res.push_back(tmp_vec);
tmp_vec.clear();
cur = next;
next = 0;
}
}
return res;
}
};
其实是书上的思路
这种记录每行有几个点的方法真是hin棒棒棒啊~
/*
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> > res;
if(pRoot == NULL)
return res;
vector<int> temp;
queue<struct TreeNode*> seq_tree;
seq_tree.push(pRoot);
int cur = 1, next = 0;
while(!seq_tree.empty()){
temp.push_back(seq_tree.front()->val);
cur--;
if(seq_tree.front()->left != NULL) {
seq_tree.push(seq_tree.front()->left);
next++;
}
if(seq_tree.front()->right != NULL) {
seq_tree.push(seq_tree.front()->right);
next++;
}
seq_tree.pop();
if(cur == 0) {
res.push_back(temp);
temp.clear();
cur = next;
next = 0;
}
}
return res;
}
};