zoukankan      html  css  js  c++  java
  • 剑指offer-面试题7-重建二叉树-二叉树

    /*
    题目:
    	输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。
    */
    /*
    思路:
    	使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。
    	采用递归的方法建立。
    */
    struct BinaryTreeNode{
    	int value;
    	BinaryTreeNode* left;
    	BinaryTreeNode* right
    }
    
    BinaryTreeNode* Construct(int* preOrder,int* Inorder,int length){
    	if(preOrder == null || Inorder == null || length <= 0){
    		return null;
    	}
    	return ConstructCore(preOrder,preOrder+length-1,Inorder,Inorder+length-1);
    }
    
    BinaryTreeNode* ConstructCore(int *preOrder,int* endPreOrder,int* inOrder,int *endInOrder){
    	BinaryTreeNode* root = new BinaryTreeNode();
    	root->value = *preOrder;
    	root->left = null;
    	root->right = null;
    	
    	if(preOrder == endInOrder){
    		if(inOrder == endInOrder && preOrder == inOrder){
    			return root;
    		}
    		else{
    			throw std::exception("Invalid input");
    		}
    	}
    	
    	//在中序遍历中找到根节点
    	int* rootInorder = inOrder;
    	while(rootInorder <= endInOrder && *rootInorder != root->value){
    		rootInorder++;
    	}
    	
    	int leftLength = rootInorder - inOrder;
    	int *leftPreOrderEnd = preOrder + leftLength;
    	
    	//创建左子树
    	if(leftLength > 0){
    		root->left = ConstructCore(preOrder+1,leftPreOrderEnd,inOrder,rootInorder-1);
    	}
    	
    	if(leftLength < endPreOrder - preOrder){
    		root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInorder+1,endInOrder);
    	}
    	return root;
    }
    	
    	
    	
    	
    

       

  • 相关阅读:
    cdn服务器
    面向对象---特----性
    我自己总结的一些知识点--分享
    进程与线程的区别
    centos忘记root用户的密码
    svn上传时显示database is locked
    公司memcache安装方式及启动方式
    阿里云挂载快照盘
    阿里云卸载磁盘是报错
    scp
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11809036.html
Copyright © 2011-2022 走看看