0
点赞
收藏
分享

微信扫一扫

算法-二叉树:二叉树的所有路径

海牙秋天 2022-02-07 阅读 102

算法-二叉树:二叉树的所有路径

给出一个二叉树,返回所有从根节点到叶子节点的路径。

思路解析:需要从父节点指向子节点,显然使用前序遍历比较方便。

//方法一:递归
void allPath(TreeNode* root,vector<int>& path, vector<string>& str){
    //中
    path.push_back(root->val);
    if(root->left==NULL && root->right==NULL){ //叶子节点
        string s;
        for(int i = 0; i < path.size()-1; i++){
            s = s+to_string(path[i])+"->";
        }
        s = s+to_string(path[path.size()-1]);
        str.push_back(s);
    }
    //左
    if(root->left){
        allPath(root->left,path,str);
        path.pop_back();//回溯!!!不要忘记,不然下面right路径要出错
    }
    //右
    if(root->right){
        allPath(root->right,path,str);
        path.pop_back();//回溯!!!不要忘记
    }
}

//方法二:迭代
void allPath(TreeNode* root,vector<int>& path, vector<string>& str){
    stack<TreeNode*> st;
    stack<string> sPath;//保存遍历路径的节点
    if(root == NULL) return;
    
    st.push(root);
    sPath.push(to_string(root->val));
    while(!st.empty()){
        //中
        TreeNode* node = st.top();
        st.pop();
        path.push_back(node->val);
        string s = sPath.top();
        sPath.pop();
        if(!node->left && !node->right) { //叶子节点
            str.push_back(s);
        }
        //右
        if(node->right){
            st.push(node->right);
            sPath.push(s + "->" + to_string(node->right->val));
        }
        //左
        if(node->left){
            st.push(node->left);
            sPath.push(s + "->" + to_string(node->left->val));
        }
    }
}
举报

相关推荐

0 条评论