码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer-面试题7-重建二叉树-二叉树

时间:2019-11-06 22:59:13      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:treenode   order   length   通过   ret   ons   div   off   中序遍历   

/*
题目:
	输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。
*/
/*
思路:
	使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。
	采用递归的方法建立。
*/
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;
}
	
	
	
	

   

剑指offer-面试题7-重建二叉树-二叉树

标签:treenode   order   length   通过   ret   ons   div   off   中序遍历   

原文地址:https://www.cnblogs.com/buaaZhhx/p/11809036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!