給定一個二叉樹,節點值為0-9,從根節點到葉子結點組成一個數,求二叉樹所有組成的數的和
阿新 • • 發佈:2019-01-06
根節點 到葉子節點組成一個數
前序遍歷 每層的值都為上一層*10+本層結點的值
int sumNumbers(TreeNode *root) { int sum=0; if(root==NULL) return sum; return PreOrder(root,sum); } int PreOrder(TreeNode* root,int sum){ sum=sum*10+root->val; if(root->left==NULL&&root->right==NULL) return sum; int left=0; int right=0; if(root->left!=NULL) left=PreOrder(root->left,sum); if(root->right!=NULL) right=PreOrder(root->right,sum); return left+right; }
非遞迴
int sumNumbers(TreeNode* root) { if(root == NULL) return 0; stack<TreeNode*> s; int res = 0; int cur = 0; TreeNode* p = root; TreeNode* last = NULL; while(p || s.size()){ if(p){ //遍歷左子樹 s.push(p); cur = cur * 10 + p->val; p = p->left; }else{ p = s.top(); if(p->right && p->right != last){ //右節點存在且沒被訪問過 p = p->right; }else{ //返回上一層節點 s.pop(); last = p; if(p->left == NULL && p->right == NULL) //葉節點 就儲存 res += cur; cur /= 10; p=NULL; } } } return res; }
廣度優先遍歷
int sumNumbers(TreeNode *root) { if(root==NULL) return 0; deque<TreeNode*> que; que.push_back(root); vector<TreeNode*> leafNode; //鍵為子節點,值為父節點 unordered_map<TreeNode*,TreeNode*> mp; mp[root]=root; while(!que.empty()){ TreeNode* p=que.front(); que.pop_front(); if(p->left!=NULL){ mp[p->left]=p; que.push_back(p->left); } if(p->right!=NULL){ mp[p->right]=p; que.push_back(p->right); } if(p->left==NULL&&p->right==NULL) //葉節點儲存 leafNode.push_back(p); } int sum=0; //從每一個葉節點向上遍歷直到根節點 for(auto p : leafNode){ int i=1; int count=0; while(p!=root){ count += p->val*i; p=mp[p]; i=i*10; } count += root->val*i; sum += count; } return sum; }