多叉树(包括二叉)如何用栈和递归两种方法前序遍历

算法学习所学习的永远不是代码而是思想

首先说二叉树的前序遍历
定义二叉树的结构体(类)

calss TreeNode{
public:
    int val ; 
    TreeNode *left ;
    TreeNode *right ;
    TreeNode ( int _val) {
        val = _val ;
        left == NULL ;
        right == NULL ; 
    }
};

那么探讨下如何前序遍历,实际上就是深搜这颗树

代码十分简单

void dfs( TreeNode *root){
    if( root == NULL ) 
        return ;
    cout << root->val <<endl;
    dfs( root->left);
    dfs( root->right);
}

现在谈论如何用栈模拟我们会把真正的思想放在多叉树里用图的思路来说明这里先放上代码

vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans ;
        stack<TreeNode *> slist ;
        if( root == NULL )
            return ans ;
        slist.push(root);
        while( slist.size() ){
            TreeNode *top = slist.top() ;
            slist.pop();
            ans.push_back( top->val ) ;
            if( top->right )
                slist.push(top->right ) ;
            if( top->left )
                slist.push(top->left );
        }
        return ans ;
    }

看官先别着急干货在后面

先来定义多叉树

struct Node {
    int val ;
    vector<Node *>children;
    Node(int _val){
        val = _val ;
    }
};

那么多叉树的深搜和前面类似和前面不同我觉得多叉树的遍历思路和图的遍历思路更像,如同链接表一般遍历

void dfs( Node *root ){
    if( root == NULL ) {
        return ;
    }
    cout << root->val <<endl;
    for( int i=0 ; i<root->children.size();i++){
        dfs( root->children[i]);
    }
}

正文来了
我们如何利用栈来模仿在图中的深度优先搜索观察根节点
遍历根节点后我们先遍历多叉树最左边的节点,和图中我们深搜一样,其实就是链接表里的第一个节点,因为栈的前进后出关系,我们只需要倒着进栈就可以顺着出栈如同邻接表一样

vector<int> preorder(Node* root) {
        vector< int > ans ; 
        stack <Node *> slist ;
        if( root == NULL ) 
            return ans ;
        slist.push( root ) ;
        while( slist.size() ){
            Node *top = slist.top() ;
            slist.pop();
            ans.push_back( top->val ) ;
            for( int i=top->children.size()-1;i>=0 ; i--){
                slist.push(top->children[i]);
            }
        }
        return ans ; 
    }

这时再看二叉树的前序遍历是否恍然大悟

猜你喜欢

转载自blog.csdn.net/weixin_38739799/article/details/79149592