本文LeetCode(http://www.leetcode.com/onlinejudge)内的binary tree travel,包含3个:
1). Binary Tree Inorder Traversal
2). Binary Tree Level Order Traversal
3). Binary Tree Maximum Path Sum
1). Binary Tree Inorder Traversal
递归很简单;常规做法。非递归版本用stack保存,right,val,left依次压入。
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> v;
if (root == NULL) return v;
travel(root->left, v);
v.push_back(root->val);
travel(root->right, v);
return v;
}
void travel(TreeNode* cur, vector<int>& v) {
if (cur == NULL) return;
travel(cur->left, v);
v.push_back(cur->val);
travel(cur->right, v);
}
};
#include <stack>
using namespace std;
struct A {
TreeNode* ptr;
int val;
A (TreeNode* p, int v=-1) : ptr(p), val(v) {}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> v;
if (root == NULL) return v;
stack<A> q;
q.push(A(root));
while (!q.empty()) {
A cur = q.top(); q.pop();
if (cur.ptr == NULL) {
v.push_back(cur.val);
continue;
}
if (cur.ptr->right != NULL) q.push(A(cur.ptr->right));
q.push(A(NULL, cur.ptr->val));
if (cur.ptr->left != NULL) q.push(A(cur.ptr->left));
}
return v;
}
};
2). Binary Tree Level Order Traversal
常规做法,队列实现
#include <queue>
using namespace std;
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > res;
if (root == NULL) return res;
queue<TreeNode*> q;
q.push(root);
q.push(NULL);
TreeNode* cur;
vector<int> v;
while (!q.empty()) {
cur = q.front(); q.pop();
if (cur == NULL) {
res.push_back(v);
v.clear();
if (!q.empty()) q.push(NULL);
continue;
}
v.push_back(cur->val);
if (cur->left != NULL) q.push(cur->left);
if (cur->right != NULL) q.push(cur->right);
}
return res;
}
};
3). Binary Tree Maximum Path Sum
方法:从叶节点开始向上搞。
#include <queue>
using namespace std;
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > res;
if (root == NULL) return res;
queue<TreeNode*> q;
q.push(root);
q.push(NULL);
TreeNode* cur;
vector<int> v;
while (!q.empty()) {
cur = q.front(); q.pop();
if (cur == NULL) {
res.push_back(v);
v.clear();
if (!q.empty()) q.push(NULL);
continue;
}
v.push_back(cur->val);
if (cur->left != NULL) q.push(cur->left);
if (cur->right != NULL) q.push(cur->right);
}
return res;
}
};
上面的code貌似贴错了。
update@2013/09/04
class Solution {
public:
int res ;
int maxPathSum(TreeNode *root) {
res = -111111;
maxSum(root);
return res;
}
int maxSum(TreeNode* cur) {
if (cur == NULL) return 0;
int left = max(maxSum(cur->left) , 0);
int right = max(maxSum(cur->right), 0);
int t = left + right + cur->val;
res = (t > res ? t : res);
t = max(left, right) + cur->val;
return max(t, 0);
}
};

1306

被折叠的 条评论
为什么被折叠?



