经典面试题(六)重构二叉树

12 篇文章 0 订阅

给定先序遍历与后序遍历的二叉树,重构该二叉树。例如先序遍历的结果{1,2,4,7,3,5,6,8},中序遍历的结果{4,7,2,1,5,3,8,6},最后得到一个二叉树

root-1
        left-2
                left-4
                        right-7
        right-3
                left-5
                right-6
                        left-8


打印的显示方式不太好,讲究一下。注意的是,上节点是表示二叉树的右节点。

代码如下所示

主函数:

#include "Tree.h"

int main(){
  int inorder[] = {4,7,2,1,5,3,8,6};
  int preorder[]= {1,2,4,7,3,5,6,8};
  TreeNode* root = rebuild(inorder,preorder,8);
  preorder_printTree(root);
  delete root;
  system("PAUSE");
}

Tree头文件

#include <cstdlib>

class TreeNode{
public:
  TreeNode* m_pLeft;
  TreeNode* m_pRight;
  int       value;  
  TreeNode(int v){
    value   = v;
    m_pLeft = NULL;
    m_pRight= NULL;
  }
  ~TreeNode(){
    if(!m_pLeft){
      delete m_pLeft;
      m_pLeft = NULL;
    }
    if(!m_pRight){
      delete m_pRight;
      m_pRight = NULL;
    }
  }
};

TreeNode* rebuild(int* inorder, int* preorder, int len);
void preorder_printTree(TreeNode* root);

Tree源文件:

#include "Tree.h"
#include <iostream>
//using namespace std;


TreeNode* rebuild(int* inorder, int* preorder, int len){
  if(!inorder || !preorder || 0 == len)
    return NULL;
  int llen = 0;
  for( ; llen < len; ++llen){
    if(inorder[llen]==preorder[0])
      break;
  }
  int rlen = len-llen-1;
  int* left = inorder;
  int* right= inorder+llen+1;
  TreeNode* root = new TreeNode(preorder[0]);
  root->m_pLeft = rebuild(left, preorder+1, llen);
  root->m_pRight= rebuild(right,preorder+llen+1,rlen);
  return root;
}


void preorder_printTree(TreeNode* root, int level, const char type[]){   
  if(!root)  
    return;  
  for(int i = 0 ; i < level ; i++)
    std::cout<<"\t";  
  std::cout<<type<<"-"<<root->value<<std::endl;
  preorder_printTree(root->m_pLeft, level+1,"left");
  preorder_printTree(root->m_pRight, level+1,"right");
}


void preorder_printTree(TreeNode* root){
  preorder_printTree(root,0,"root");
}
  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值