c++ 二叉树打印节点路径

leetcode上有道题是关于path sum的,我第一时间的做法是用二叉树的路径去与sum比较。所以需要去打印出二叉树的节点路径,以下是用回溯法。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 struct TreeNode {
 6     int val;
 7     TreeNode *left;
 8     TreeNode *right;
 9     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
10     
11 };
12 class Solution {
13 public:
14     bool hasPathSum(TreeNode* root, int sum) {
15         vector<int> path;
16         path.reserve(100);
17         bool flag = false;
18         printPaths(root, path, 0);
19         return flag;
20     }
21     void printPaths(TreeNode* node, vector<int>& path, int pathlen) {
22         if (node == NULL) return;
23         // append this node to the path array 
24         path[pathlen++] = node->val;
25         // path.push_back(node->val);
26         // it's a leaf, so print the path that led to here  
27         if (node->left == NULL && node->right == NULL) {
28             printArray(path, pathlen);
29         }
30         else {
31             // otherwise try both subtrees  
32             printPaths(node->left, path, pathlen);
33             printPaths(node->right, path, pathlen);
34             path.pop_back();
35         }
36     }
37     void printArray(vector<int> &ints, int len) {
38         for (int i = 0; i < len; i++) {
39              cout << ints[i] << " " ; 
40         }
41          cout << endl;
42     }
43 };
44 
45 int main()
46 {
47     Solution res;
48     TreeNode t1(5);
49     TreeNode t2(4);
50     TreeNode t3(8);
51     TreeNode t4(11);
52     TreeNode t5(13);
53     TreeNode t6(4);
54     TreeNode t7(7);
55     TreeNode t8(2);
56     TreeNode t9(1);
57     t1.left = &t2;
58     t1.right = &t3;
59     t2.left = &t4;
60     t3.left = &t5;
61     t3.right = &t6;
62     t4.left = &t7;
63     t4.right = &t8;
64     t6.right = &t9;
65     TreeNode * root = &t1;
66     bool ret = res.hasPathSum(root,22);
67     
68     system("pause");
69     return 0;
70 }

接着与sum做比较就能知道path sum是否相同了。

 1 class Solution {
 2 public:
 3     bool hasPathSum(TreeNode* root, int sum) {
 4         vector<int> path;
 5         path.reserve(100);
 6         bool flag = false;
 7         printPaths(root, path, 0, sum, flag);
 8         return flag;
 9     }
10     void printPaths(TreeNode* node, vector<int>& path, int pathlen, int& sum, bool& flag) {
11         if (node == NULL) return;
12         // append this node to the path array 
13         path[pathlen++] = node->val;
14         // path.push_back(node->val);
15         // it's a leaf, so print the path that led to here  
16         if (node->left == NULL && node->right == NULL) {
17             printArray(path, pathlen, sum, flag);
18             if (flag) return;
19         }
20         else {
21             // otherwise try both subtrees  
22             printPaths(node->left, path, pathlen, sum, flag);
23             printPaths(node->right, path, pathlen, sum, flag);
24             path.pop_back();
25         }
26     }
27     void printArray(vector<int> &ints, int len, int& sum, bool& flag) {
28         int num = 0;
29         for (int i = 0; i < len; i++) {
30             // cout << ints[i] << " " ; 
31             num += ints[i];
32         }
33         if (num == sum) flag = true;
34         // cout << endl;
35     }
36 };

不过这种方法不好,空间开销大,效率还不高。在网上看到这种解法贴一下地址:

 点击

posted @ 2019-02-12 10:48  Hwangzhiyoung  阅读(1058)  评论(0编辑  收藏  举报