zoukankan      html  css  js  c++  java
  • 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    // test20.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include<iostream>
    #include<vector>
    #include<string>
    #include<queue>
    #include<stack>
    
    using namespace std;
    
    
     struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     };
    
    class Solution {
    public:
    	struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {
    		//先通过前序遍历找到跟节点
    		//再通过跟节点把中序遍历的结果分为左子树tree_left和右子树tree_right
    		//tree_left在前序遍历中的第一个节点就是跟节点的左孩子
    		//tree_right在前序遍历中的第一个节点就是跟节点的右孩子
    		if (pre.size() == 0) return NULL;
    		/*if (pre.empty() || in.empty() || pre.size() != in.size())
    			return NULL;*/
    		TreeNode* root = new TreeNode(pre[0]); //前序遍历的第一个节点就是跟节点
    	if (pre.size() == 1) return root;
    
    		vector<int> in_left, in_right;//中序遍历中的左子树和右子树
    		vector<int> pre_left, pre_right;//前序遍历中的左子树和右子树
    		int num_left=0, num_right=0; //分别存储左子树和右子树的个数
    		int cur = pre[0]; //存储谦虚遍历中的第一个值,根据这个值在将中序遍历分为左子树和右子树
    	
    		int pos = 0;//中序遍历中cur中的位置
    		
    
    		for (int i = 0;i < in.size();i++)  //计算中序遍历的左子树和右子树
    		{
    			if (in[i] == cur)
    				pos = i;
    		}
    		for (int i = 0;i < in.size();i++)
    		{
    			if (i < pos)
    			{
    				in_left.push_back(in[i]);
    				num_left++;
    			}
    				
    			if (i > pos)
    			{
    				in_right.push_back(in[i]);
    				num_right++;
    			}
    		}
    
    		for (int i = 1;i < pre.size();i++) //计算先序遍历的左子树和右子树
    		{
    			if (num_left)
    			{
    				pre_left.push_back(pre[i]);
    				--num_left;
    			}
    			else if (num_right)
    			{
    				pre_right.push_back(pre[i]);
    				--num_right;
    			}
    			else
    			{
    
    			}
    		}
    
    		//if(!pre_left.empty()&&root!=NULL)
    			root->left=reConstructBinaryTree(pre_left,in_left);
    		//if(!pre_right.empty() && root != NULL)
    			root->right = reConstructBinaryTree(pre_right,in_right);
    			return root;//最后返回根节点,这点很重要,之前都是因为这个一直调试不通过
    
    	}
    	void preOrder(TreeNode* &T)
    	{
    		if (T == NULL) return;
    		else
    		{
    			cout << T->val << "  ";
    			preOrder(T->left);
    			preOrder(T->right);
    		}
    	}
    
    	void preCreate(TreeNode * &T)
    	{
    		int num;
    		cin >> num;
    		if (num == 0) return;
    		else
    		{
    			T = new TreeNode(num);
    			preCreate(T->left);
    			preCreate(T->right);
    		}
    	}
    };
    int main()
    {
    	
    	Solution so;
    	TreeNode *T;
    	vector<int> pre = { 1,2,4,7,3,5,6,8 };
    	vector<int> in = { 4,7,2,1,5,3,8,6 };
    
    	//vector<int> pre = {1,2};
    	//vector<int> in = {2,1};
    	//so.preCreate(T);
    //	cout << "创建成功!" << endl;
    
    
    
    	T = so.reConstructBinaryTree(pre,in);
    	cout << "构建成功" << endl;
    
    	cout << "前序遍历二叉树:" << endl;
    	so.preOrder(T);
    	
    	
    	cout << endl;
    	return 0;
    }
  • 相关阅读:
    服务器×××上的MSDTC不可用解决办法
    安装VS2010后,更改iis的asp.net版本
    刷新后 页面 保持滚动条位置
    Atitit.java 反编译 工具  attilax 总结
    Atitit.收银系统模块架构attilax 总结
    Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
    Atitit. Derby的使用总结attilax
    Atitit.attilax的 case list 项目经验 案例列表
    Atitit.收银系统pos 以及打印功能的行业标准
  • 原文地址:https://www.cnblogs.com/wdan2016/p/5988560.html
Copyright © 2011-2022 走看看