zoukankan      html  css  js  c++  java
  • careercup-树与图 4.4

    4.4 给定一棵二叉树,设计一个算法,创建含有某一深度上所有结点的链表(比如,若一棵树的深度为D,则会创建D个链表)。

    类似于leetcode:Populating Next Right Pointers in Each Node II

    解答

    这道题目本质上是个BFS,也就是说,如果已经构建了第i层结点的链表, 那么将此链表中每个结点的左右孩子结点取出,即可构建第i+1层结点的链表。 设结点类型为TreeNode,那么指向每一层链表头结点的类型为list<TreeNode*>, 将每一层头结点指针放到vector中。如果当前层的链表不为空, 那么将该链表的结点依次取出,然后将这些结点的不为空的孩子放入新的链表中。

    C++实现代码:

    #include<vector>
    #include<iostream>
    #include<list>
    using namespace std;
    
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    TreeNode* helper(vector<int>::iterator begin,vector<int>::iterator end)
    {
        TreeNode *root=NULL;
        if(begin+1==end)
            return new TreeNode(*begin);
        if(begin>=end)
            return NULL;
        int mid=(end-begin-1)/2;
        root=new TreeNode(*(begin+mid));
        root->left=helper(begin,begin+mid);
        root->right=helper(begin+mid+1,end);
        return root;
    }
    
    TreeNode* createAVL(vector<int> &vec)
    {
        if(vec.empty())
            return NULL;
        return helper(vec.begin(),vec.end());
    }
    
    vector<list<TreeNode*> > find_level_linklists(TreeNode *root)
    {
        list<TreeNode*> ll;
        vector<list<TreeNode*> > ret;
        ll.push_back(root);
        ret.push_back(ll);
        while(!ll.empty())
        {
            list<TreeNode*> tmp=ll;
            ll.clear();
            auto iter=tmp.begin();
            while(iter!=tmp.end())
            {
                TreeNode *node=*iter;
                if(node->left)
                    ll.push_back(node->left);
                if(node->right)
                    ll.push_back(node->right);
                iter++;
            }
            if(!ll.empty())
                ret.push_back(ll);
        }
        return ret;
    }
    
    void print(vector<list<TreeNode*> > res)
    {
        vector<list<TreeNode*> >::iterator vit;
        for(vit=res.begin(); vit!=res.end(); ++vit)
        {
            list<TreeNode*> li = *vit;
            list<TreeNode*>::iterator lit;
            for(lit=li.begin(); lit!=li.end(); ++lit)
            {
                TreeNode *n = *lit;
                cout<<n->val<<" ";
            }
            cout<<endl;
        }
    }
    
    int main()
    {
        vector<int> vec= {1,2,3,4,5,6,7,8,9,10};
        TreeNode *root=createAVL(vec);
        vector<list<TreeNode*> > res=find_level_linklists(root);
        print(res);
    }

    运行结果:

  • 相关阅读:
    红黑树实现
    Java环境变量的配置及意义
    Java 内存分配全面浅析
    吸血鬼数字
    nat模式、路由模式,网桥模式
    WebService 的创建,部署和使用
    摩尔定律
    计算机组成
    世界是数字的
    面试
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4147986.html
Copyright © 2011-2022 走看看