C++实现二叉树遍历序列的求解方法

所属分类: 软件编程 / C 语言 阅读数: 51
收藏 0 赞 0 分享

本文详细讲述了C++实现二叉树遍历序列的求解方法,对于数据结构与算法的学习有着很好的参考借鉴价值。具体分析如下:

一、由遍历序列构造二叉树

        

    如上图所示为一个二叉树,可知它的遍历序列分别为:

                      先序遍历:ABDECFG

                      中序遍历:DBEAFCG

                      后序遍历:DEBFGCA

我们需要知道的是,由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树;由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树;但是如果只知道先序序列和后序序列,则无法唯一确定一棵二叉树。

二、已知二叉树的先序序列和中序序列,求后序序列。

因为由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树,所以进而可以唯一地确定它的后序遍历。在先序遍历序列中,第一个结点一定是二叉树的根结点,而在中序遍历中,根结点必然将中序序列分割成两个子序列,前一个子序列就是左子树的中序序列,后一个子序列就是右子树的中序序列。根据这两个子序列的长度,可以在先序序列中找到对应的左子树先序序列和右子树先序序列。而左子树先序序列的第一个结点是左子树的根结点,右子树先序序列的第一个结点是右子树的根结点。如此递归地进行下去,便能唯一地确定这棵二叉树。

C++实现代码如下:

/*************************************************************************
 > File Name: Test.cpp
 > Author: SongLee
 ************************************************************************/
#include<iostream>
using namespace std;

struct TreeNode
{
  struct TreeNode* left;
  struct TreeNode* right;
  char elem;
};


TreeNode* PostOrderFromOrderings(char* inorder, char* preorder, int length)
{
  if(length == 0)
  {
    return NULL;
  }
  TreeNode* node = new TreeNode;
  node->elem = *preorder;
  int rootIndex = 0;
  for(; rootIndex < length; rootIndex++) // 求左子树的长度
  {
    if(inorder[rootIndex] == *preorder)
      break;
  }
  node->left = PostOrderFromOrderings(inorder, preorder + 1, rootIndex);
  node->right = PostOrderFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));
  cout << node->elem << " ";  // 求后序序列,所以最后输出根结点
  return node;
}

int main()
{
  char* pre = "ABDECFG";
  char* in = "DBEAFCG";
  PostOrderFromOrderings(in, pre, 7);
  cout << endl;
  return 0;
}

三、已知二叉树的后序序列和中序序列,求先序序列。

同理,由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树,所以进而可以唯一地确定先序遍历序列。因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分。

C++实现代码如下:

/*************************************************************************
 > File Name: Test1.cpp
 > Author: SongLee
 ************************************************************************/
#include<iostream>
using namespace std;

struct TreeNode
{
  struct TreeNode* left;
  struct TreeNode* right;
  char elem;
};

TreeNode* PreOrderFromOrderings(char* inorder, char* postorder, int length)
{
  if(length == 0)
  {
    return NULL;
  }
  TreeNode* node = new TreeNode;
  node->elem = postorder[length-1];
  int rootIndex = 0;
  for(; rootIndex < length; rootIndex++)  // 求左子树的长度
  {
    if(inorder[rootIndex] == postorder[length-1])
      break;
  }
  cout << node->elem << " ";  // 求先序序列,所以先输出根结点
  node->left = PreOrderFromOrderings(inorder, postorder, rootIndex);
  node->right = PreOrderFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex + 1));
  return node;
}

int main()
{
  char* post = "DEBFGCA";
  char* in = "DBEAFCG";
  PreOrderFromOrderings(in, post, 7);
  cout << endl;
  return 0;
}

相信本文所述实例对于大家学习数据结构与算法会起到一定的帮助作用。

更多精彩内容其他人还在看

详解C++ string字符串类

这篇文章主要介绍了C++ string字符串类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C++单例类模板详解

这篇文章主要介绍了C++单例类模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言实现数据结构迷宫实验

这篇文章主要为大家详细介绍了C语言实现数据结构迷宫实验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫求解问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫求解问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生考试系统

这篇文章主要为大家详细介绍了C语言实现小学生考试系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生随机出题测试计分

这篇文章主要为大家详细介绍了C语言实现小学生随机出题测试计分,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生计算机辅助教学系统

这篇文章主要为大家详细介绍了C语言实现小学生计算机辅助教学系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

这篇文章主要介绍了C++中构造函数,拷贝构造函数和赋值函数的区别和实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言清除scanf()缓存的案例讲解

今天小编就为大家分享一篇关于C语言清除scanf()缓存的案例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多