【面试题六】重建二叉树
来源:互联网 发布:刷票软件 微信安卓 编辑:程序博客网 时间:2024/05/29 16:19
重建二叉树
在前序遍历和中序遍历两个序列中,确定了根结点的值,进而分别找到了左右子树对应的序列;
ConstructBinaryTree.cpp:
#include <iostream>#include "BinaryTree.h"#include <exception>#include <cstdio>using namespace std;BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder);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* startPreorder, int* endPreorder, int* startInorder, int* endInorder){ // 前序遍历序列的第一个数字是根结点的值 int rootValue = startPreorder[0]; BinaryTreeNode* root = new BinaryTreeNode(); root->m_nValue = rootValue; root->m_pLeft = root->m_pRight = NULL; if(startPreorder == endPreorder) { if(startInorder == endInorder && *startPreorder == *startInorder) return root; else throw std::exception(); } // 在中序遍历中找到根结点的值 int* rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue) ++ rootInorder; if(rootInorder == endInorder && *rootInorder != rootValue) throw std::exception(); int leftLength = rootInorder - startInorder; int* leftPreorderEnd = startPreorder + leftLength; if(leftLength > 0) { // 构建左子树 root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1); } if(leftLength < endPreorder - startPreorder) { // 构建右子树 root->m_pRight = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder); } return root;}// ====================测试代码====================void Test(char* testName, int* preorder, int* inorder, int length){ if(testName != NULL) printf("%s begins:\n", testName); printf("The preorder sequence is: "); for(int i = 0; i < length; ++ i) printf("%d ", preorder[i]); printf("\n"); printf("The inorder sequence is: "); for(int i = 0; i < length; ++ i) printf("%d ", inorder[i]); printf("\n"); try { BinaryTreeNode* root = Construct(preorder, inorder, length); PrintTree(root); DestroyTree(root); } catch(std::exception& exception) { printf("Invalid Input.\n"); }}// 普通二叉树// 1// / \// 2 3 // / / \// 4 5 6// \ /// 7 8void Test1(){ const int length = 8; int preorder[length] = {1, 2, 4, 7, 3, 5, 6, 8}; int inorder[length] = {4, 7, 2, 1, 5, 3, 8, 6}; Test("Test1", preorder, inorder, length);}// 所有结点都没有右子结点// 1// / // 2 // / // 3 // /// 4// /// 5void Test2(){ const int length = 5; int preorder[length] = {1, 2, 3, 4, 5}; int inorder[length] = {5, 4, 3, 2, 1}; Test("Test2", preorder, inorder, length);}// 所有结点都没有左子结点// 1// \ // 2 // \ // 3 // \// 4// \// 5void Test3(){ const int length = 5; int preorder[length] = {1, 2, 3, 4, 5}; int inorder[length] = {1, 2, 3, 4, 5}; Test("Test3", preorder, inorder, length);}// 树中只有一个结点void Test4(){ const int length = 1; int preorder[length] = {1}; int inorder[length] = {1}; Test("Test4", preorder, inorder, length);}// 完全二叉树// 1// / \// 2 3 // / \ / \// 4 5 6 7void Test5(){ const int length = 7; int preorder[length] = {1, 2, 4, 5, 3, 6, 7}; int inorder[length] = {4, 2, 5, 1, 6, 3, 7}; Test("Test5", preorder, inorder, length);}// 输入空指针void Test6(){ Test("Test6", NULL, NULL, 0);}// 输入的两个序列不匹配void Test7(){ const int length = 7; int preorder[length] = {1, 2, 4, 5, 3, 6, 7}; int inorder[length] = {4, 2, 8, 1, 6, 3, 7}; Test("Test7: for unmatched input", preorder, inorder, length);}int main(){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); return 0;}
BinaryTree.h:
#ifndef _BINARY_TREE_H_#define _BINARY_TREE_H_struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };BinaryTreeNode* CreateBinaryTreeNode(int value);void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight);void PrintTreeNode(BinaryTreeNode* pNode);void PrintTree(BinaryTreeNode* pRoot);void DestroyTree(BinaryTreeNode* pRoot);#endif /*_BINARY_TREE_H_*/
BinaryTree.cpp:
#include <iostream>#include <cstdio>#include "BinaryTree.h"using namespace std;BinaryTreeNode* CreateBinaryTreeNode(int value){ BinaryTreeNode* pNode = new BinaryTreeNode(); pNode->m_nValue = value; pNode->m_pLeft = NULL; pNode->m_pRight = NULL; return pNode;}void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight){ if(pParent != NULL) { pParent->m_pLeft = pLeft; pParent->m_pRight = pRight; }}void PrintTreeNode(BinaryTreeNode* pNode){ if(pNode != NULL) { printf("value of this node is: %d\n", pNode->m_nValue); if(pNode->m_pLeft != NULL) printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue); else printf("left child is null.\n"); if(pNode->m_pRight != NULL) printf("value of its right child is: %d.\n", pNode->m_pRight->m_nValue); else printf("right child is null.\n"); } else { printf("this node is null.\n"); } printf("\n");}void PrintTree(BinaryTreeNode* pRoot){ PrintTreeNode(pRoot); if(pRoot != NULL) { if(pRoot->m_pLeft != NULL) PrintTree(pRoot->m_pLeft); if(pRoot->m_pRight != NULL) PrintTree(pRoot->m_pRight); }}void DestroyTree(BinaryTreeNode* pRoot){ if(pRoot != NULL) { BinaryTreeNode* pLeft = pRoot->m_pLeft; BinaryTreeNode* pRight = pRoot->m_pRight; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); }}
Makefile:
.PHONY:cleanCPP=g++CFLAGS=-Wall -gBIN=testOBJS=ConstructBinaryTree.o BinaryTree.oLIBS=$(BIN):$(OBJS)$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)%.o:%.cpp$(CPP) $(CFLAGS) -c $< -o $@clean:rm -f *.o $(BIN)
运行结果:
Test1 begins:The preorder sequence is: 1 2 4 7 3 5 6 8 The inorder sequence is: 4 7 2 1 5 3 8 6 value of this node is: 1value of its left child is: 2.value of its right child is: 3.value of this node is: 2value of its left child is: 4.right child is null.value of this node is: 4left child is null.value of its right child is: 7.value of this node is: 7left child is null.right child is null.value of this node is: 3value of its left child is: 5.value of its right child is: 6.value of this node is: 5left child is null.right child is null.value of this node is: 6value of its left child is: 8.right child is null.value of this node is: 8left child is null.right child is null.Test2 begins:The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 5 4 3 2 1 value of this node is: 1value of its left child is: 2.right child is null.value of this node is: 2value of its left child is: 3.right child is null.value of this node is: 3value of its left child is: 4.right child is null.value of this node is: 4value of its left child is: 5.right child is null.value of this node is: 5left child is null.right child is null.Test3 begins:The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 1 2 3 4 5 value of this node is: 1left child is null.value of its right child is: 2.value of this node is: 2left child is null.value of its right child is: 3.value of this node is: 3left child is null.value of its right child is: 4.value of this node is: 4left child is null.value of its right child is: 5.value of this node is: 5left child is null.right child is null.Test4 begins:The preorder sequence is: 1 The inorder sequence is: 1 value of this node is: 1left child is null.right child is null.Test5 begins:The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 5 1 6 3 7 value of this node is: 1value of its left child is: 2.value of its right child is: 3.value of this node is: 2value of its left child is: 4.value of its right child is: 5.value of this node is: 4left child is null.right child is null.value of this node is: 5left child is null.right child is null.value of this node is: 3value of its left child is: 6.value of its right child is: 7.value of this node is: 6left child is null.right child is null.value of this node is: 7left child is null.right child is null.Test6 begins:The preorder sequence is: The inorder sequence is: this node is null.Test7: for unmatched input begins:The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 8 1 6 3 7 Invalid Input.
- 【面试题六】重建二叉树
- 剑指Offer----面试题六:重建二叉树
- 《剑指Offer》面试题六之重建二叉树
- 面试题重建二叉树
- 面试题----重建二叉树
- 面试题整理-重建二叉树
- 面试题6:重建二叉树
- 面试题5:重建二叉树
- 《剑指Offer》面试题-重建二叉树
- 重建二叉树(面试题 6)
- 面试题6:重建二叉树
- 面试题6- 重建二叉树
- 面试题6 重建二叉树
- 面试题6:重建二叉树
- 面试题6 重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- oracle修改字段报错:ORA-22858
- vmstat 命令详解
- 25条提高iOS App性能的技巧和诀窍
- C:assert()函数用法
- 【面试题七】栈和队列
- 【面试题六】重建二叉树
- Linux strace命令
- 【面试题五】从尾到头打印链表
- Maven核心之pom详解
- 线段树模板
- 颜色空间转换公式
- 【面试题四】c/c++字符串,替换空格
- nexus s 安装 android 4.4 kitkat
- STRUTS2.3.x最基础的jar包-必须添加完整