牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。 如有两棵二叉树: T1: T2: 1 1 / / 1 1 1 他们合并后为: T3: 1 / 1 1 / / 1 1 1-笔试面试资料

这是qklbishe.com第20125 篇笔试面试资料
提供答案分析,通过本文《牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。 如有两棵二叉树: T1: T2: 1 1 / / 1 1 1 他们合并后为: T3: 1 / 1 1 / / 1 1 1-笔试面试资料》可以理解其中的代码原理,这是一篇很好的求职学习资料
本站提供程序员计算机面试经验学习,笔试经验,包括字节跳动/头条,腾讯,阿里,美团,滴滴出行,网易,百度,京东,小米,华为,微软等互联网大厂真题学习背诵。

答案:

牛牛有牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1棵二叉树,其编号为牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1。牛牛会将这牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1棵树合并为一棵。牛牛每次可以从这牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1棵树中挑选出两棵树牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1,并创建一个新根牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1且节点权值为牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1的大小不是唯一的,那么牛牛会换成和牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1大小相同且编号最小的树参与合并,牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1同理。当牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1棵树合并为一棵,请你返回最后的树。

如有两棵二叉树:
T1:        T2:    1          1   /         /   1   1      1

他们合并后为:

T3:     1    /    1   1  /   /  1   1   1

C/C++

牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。             如有两棵二叉树:     T1:        T2:    1          1   /         /   1   1      1       他们合并后为:    T3:     1    /    1   1  /   /  1   1   1 零葬

哈夫曼编码问题,构造一个小根堆存储信息体,信息体包括如下的三个信息:
  1. 树的编号
  2. 树的节点个数
  3. 树的根节点指针

小根堆的排序规则:如果两棵树的节点个数不同就按照节点数从小到大排序,否则按照树的编号从小到大排序。在堆的大小大于1时,堆顶的两棵树就是规模最小的两棵树,每次弹出它们两进行合并。然后将新树加入到小根堆中,并更新此时的最大树编号。

/**  * struct TreeNode {  *	int val;  *	struct TreeNode *left;  *	struct TreeNode *right;  *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  * };  */  struct Info {     int index;     int nodeNum;     TreeNode* tree; };  class cmp{     public:     bool operator() (Info* info1, Info* info2){         return info1->nodeNum != info2->nodeNum? info1->nodeNum > info2->nodeNum: info1->index > info2->index;     } };  class Solution { public:     /**      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可      *      *       * @param T TreeNode类vector       * @return TreeNode类      */     TreeNode* mergeTree(vector<TreeNode*>& T) {         // write code here         priority_queue <Info*, vector<Info*>, cmp> pq;         int n = T.size();         for(int i = 0; i < n; i++){             Info* info = new Info();             info->index = i;             info->nodeNum = getNodeNum(T
[i]);             info->tree = T
[i];             pq.push(info);         }         int curMaxIndex = n - 1;         while(pq.size() > 1){             // 合并两个节点数量最少的树             TreeNode* root = new TreeNode(1);             Info* leftInfo = pq.top();             pq.pop();             Info* rightInfo = pq.top();             pq.pop();             root->left = leftInfo->tree;             root->right = rightInfo->tree;             // 将新树加入堆             int treeIndex = curMaxIndex + 1;     // 新树编号             Info* info = new Info();             info->index = treeIndex;             info->nodeNum = 1 + leftInfo->nodeNum + rightInfo->nodeNum;    // 新树节点数(左子树节点数+右子树节点数+根节点)             info->tree = root;      // 新树根节点             pq.push(info);             curMaxIndex = treeIndex;    // 更新最大节点编号         }         return pq.top()->tree;     } // 层次遍历求树的节点数 private:     int getNodeNum(TreeNode* root) {         if(root == nullptr){             return 0;         }         int count = 0;         queue<TreeNode*> queue;         queue.push(root);         while(!queue.empty()){             TreeNode* cur = queue.front();             queue.pop();             count++;             if(cur->left != nullptr){                 queue.push(cur->left);             }             if(cur->right != nullptr){                 queue.push(cur->right);             }         }         return count;     } };

这个题本身思路很容易想到,但是有点卡常,本来我先用的java实现,但是只能过60%,同样的逻辑换成C++就AC了,离谱!

今天 16:11:51 回复(0)

文章部分来自互联网,侵权联系删除
www.qklbishe.com

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » 牛牛有棵二叉树,其编号为。牛牛会将这棵树合并为一棵。牛牛每次可以从这棵树中挑选出两棵树,并创建一个新根且节点权值为,该新根的左儿子为这两棵树中节点数量较少的根节点,右儿子为节点数量较多的根节点。每次合并的花费为两棵树的大小之和,得到的新树的编号为当前最大编号加一。若的大小不是唯一的,那么牛牛会换成和大小相同且编号最小的树参与合并,同理。当和大小相等时,牛牛会将编号较小的树作为左儿子,编号较大的树作为右儿子。牛牛想在花费最小的情况下将这棵树合并为一棵,请你返回最后的树。 如有两棵二叉树: T1: T2: 1 1 / / 1 1 1 他们合并后为: T3: 1 / 1 1 / / 1 1 1-笔试面试资料

提供最优质的资源集合

立即查看 了解详情