#include <stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
/**
* Definition for binary tree
**/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//先序遍历
void PreOrder(TreeNode *root)
{
if (root == NULL)
return;
std::cout << root->val << ' ';
PreOrder(root->left);
PreOrder(root->right);
}
//中序遍历
void InOrder(TreeNode *root)
{
if (root == NULL)
return;
InOrder(root->left);
std::cout << root->val << " ";
InOrder(root->right);
}
//后序遍历
void PostOrder(TreeNode *root)
{
if (root == NULL) return;
PostOrder(root->left);
PostOrder(root->right);
std::cout << root->val << ' ';
}
//哈弗曼树结点比较
bool HfCompare(TreeNode *node1, TreeNode *node2)
{
return node1->val < node2->val;
}
//根据结点序列构建哈弗曼树
TreeNode* ConstructHuffmanTree(vector<TreeNode *> &treeNodes)
{
TreeNode *root = NULL;
if (treeNodes.empty())
return root;
while (treeNodes.size() > 1)
{
//权值从小到大排序,取最小的两个结点合并
sort(treeNodes.begin(), treeNodes.end(), HfCompare);
TreeNode *leftNode = treeNodes[0];
TreeNode *rightNode = treeNodes[1];
TreeNode *tempNode = new TreeNode(leftNode->val + rightNode->val);
tempNode->left = leftNode;
tempNode->right = rightNode;
treeNodes.erase(treeNodes.begin());
treeNodes.erase(treeNodes.begin());
treeNodes.push_back(tempNode);
if (treeNodes.size() == 1)
root = treeNodes[0];
}
return root;
}
int main()
{
vector<TreeNode *> treeNodes;
int val = 0;
while (cin >> val)
{
TreeNode *tempNode = new TreeNode(val);
treeNodes.push_back(tempNode);
}
TreeNode *root = ConstructHuffmanTree(treeNodes);
PreOrder(root); //先序输出
std::cout << std::endl;
InOrder(root); //中序输出
std::cout << std::endl;
system("pause");
return 0;
}