1. 程式人生 > >給定一個二叉樹,節點值為0-9,從根節點到葉子結點組成一個數,求二叉樹所有組成的數的和

給定一個二叉樹,節點值為0-9,從根節點到葉子結點組成一個數,求二叉樹所有組成的數的和

 根節點 到葉子節點組成一個數

前序遍歷  每層的值都為上一層*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;
    }