Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1 / 2 3 5
All root-to-leaf paths are:
["1->2->5", "1->3"]
思路:用两个stack<TreeNode*> in , s;
in : 记录当前的路径 p , 和vector<int>path 相同,只不过一个记录的是 val ,一个记录点的指针。
s : 记录每个节点的 p->right
v2s : 将path转换称符合要求的string
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public:string v2s(vector<int>a){ const int len = a.size(); string re = ""; char *p = new char[500]; for (int i = 0; i<len; i++){ stringstream ss; // 需要包含头文件 #include<sstream> string temp; ss << a[i]; ss >> temp; re = re + temp; if (i != len - 1) re = re + "->"; } return re; } vector<string> binaryTreePaths(TreeNode* root) { vector<int> path; vector<string> re; if (root == NULL) return re; TreeNode * p = root; stack<TreeNode*> in, s; while (p != NULL){ if (p->left == NULL&&p->right == NULL){ in.push(p); path.push_back(p->val); re.push_back(v2s(path)); if (s.empty()) return re; else {
// 通过while循环,查找下一个需要遍历的点 while (!in.empty() && !s.empty() && (in.top())->right != s.top()){ in.pop(); path.erase(path.end()-1); } p = s.top(); s.pop(); } } else if (p->left == NULL&&p->right != NULL){ path.push_back(p->val); in.push(p); p = p->right; } else if (p->left != NULL&&p->right == NULL){ path.push_back(p->val); in.push(p); p = p->left; } else{ path.push_back(p->val); in.push(p); s.push(p->right); p = p->left; } } return re; } };
另一道相似题目
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
思路:只需要将保存的路径进行比较,相同的去掉然后相加,就能算出路径长度。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Tree { public: int getDis(TreeNode* root) { // write code here stack<TreeNode*> max, min; int m = INT_MIN, n = INT_MAX, re = 0; stack<TreeNode*> in, s; TreeNode *p = root; while (p != NULL){ if (p->left == NULL&&p->right == NULL){ in.push(p); if (p->val > m){ max = in; m = p->val; } if (p->val < n){ min = in; n = p->val; } while (!in.empty() && !s.empty() && (in.top())->right != s.top()){ in.pop(); } if (s.empty()) break; else { p = s.top(); s.pop(); } } else if (p->left == NULL&&p->right != NULL){ in.push(p); p = p->right; } else if (p->left != NULL&&p->right == NULL){ in.push(p); p = p->left; } else { in.push(p); s.push(p->right); p = p->left; } } stack<TreeNode*> t1, t2; while (!max.empty()){ t1.push(max.top()); max.pop(); } while (!min.empty()){ t2.push(min.top()); min.pop(); } while (!t1.empty() && !t2.empty()){ if (t1.top() != t2.top()) break; else t1.pop(); t2.pop(); } re = re + t1.size() + t2.size(); return re; } };