本文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); } };