zoukankan      html  css  js  c++  java
  • 剑指offer ——重建二叉树

    p62 输入前序和中序遍历的结果(不包含重复的数字),重建二叉树。

    主要是分析两个序列的规律,然后用递归的方式找到每一个根节点,从而完成构建。

    #include<iostream>
    #include <vector>
    #include <set>
    #include <functional>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include <sstream>
    #include <list>
    #include <map>
    #include <stack>
    #include <algorithm>
    #include<iomanip>
    using namespace std;
    
    class Node{
    public:
    	Node(int a = 0, Node* b = nullptr, Node* c = nullptr) :value(a), left(b),right(c){}
    	int value;
    	Node* left,*right;
    };
    
    Node* createTree(vector<int>& Pre, vector<int>& Mid, int pStart, int pEnd, int mStart, int mEnd)
    {
    	if (pStart < 0 || pEnd >= Pre.size() || mStart < 0 || mEnd >= Mid.size() || pStart > pEnd || mStart > mEnd)
    		return nullptr;
    	if (pEnd - pStart != mEnd - mStart)
    	{
    		cout << "Error : nums can't match " << endl;
    		return nullptr;
    	}
    	int value = Pre[pStart];
    	Node* root = new Node(value);
    	int pos = mStart;
    	for (; pos <= mEnd; pos++)
    		if (Mid[pos] == value)
    			break;
    
    	//判断是否存在错误
    	if (pos > mEnd)
    	{
    		cout << "Error : Cann't find the root " << endl;
    		delete root;
    		root = nullptr;
    		return nullptr;
    	}
    
    	root->left = createTree(Pre, Mid, pStart + 1, pStart + pos - mStart, mStart, pos - 1);
    	root->right = createTree(Pre, Mid, pStart + pos - mStart+1, pEnd, pos+1, mEnd);
    
    	return root;
    }
    Node* solution(vector<int>& a, vector<int>& b)
    {
    	return createTree(a, b, 0, a.size() - 1, 0, b.size() - 1);
    }
    
    void printTree(Node* root,int length=0)
    {
    	if (root == nullptr)
    		return;
    
    	if (root->left != nullptr)
    		printTree(root->left, length + 1);
    
    	for (int i = 0; i < length; i++)
    		cout << " ";
    	cout << root->value << endl;
    
    
    	if (root->right != nullptr)
    		printTree(root->right, length + 1);
    
    }
    int main(int argc, char** args)
    {
    	vector<int> a = { 1, 2, 4, 7, 3, 5, 6 ,8};
    	vector<int> b = { 4, 7, 2, 1, 5, 3, 8, 6 };
    	Node* root = solution(a, b);
    
    	printTree(root);
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    Eclipse出错
    每天学点MVC 【ExecuteStoreCommand SqlParameterCollection 中已包含 SqlParameter】
    ORA12541: TNS: 无监听程序 每天学点Oracle
    每天学点Oracle10gplSql命令
    Access中Sql语句如何运行问题
    如何网络赚钱
    每天学点Oracle10g客户端配置
    存储过程(工作随笔)审核退单
    存储过程(工作随笔)慢性病
    存储过程(工作随笔) 住院情况分析
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9579654.html
Copyright © 2011-2022 走看看