本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

#include

#include

#include

using namespace std;

typedef struct BTree

{

int val;

struct BTree *left,*right;

}BTree;

/*二叉树的类,包含着操作二叉树的各种方法*/

class Tree

{

public:

BTree *create_node(int level,string pos);

void PreOrder(BTree *t);  //先序遍历

void InOrder(BTree *t);  //中序遍历

void PostOrder(BTree *t);  //后序遍历

void NonRecursivePreOrder(BTree*t); //非递归前序遍历

void NonRecursiveInOrder(BTree*t);  //非递归中序遍历

void NonRecursivePostOrder(BTree*t);//非递归后序遍历

BTree* PreOrder_and_INorder_RemakeTree(int *startPreorder,int *endPreder,int *startInorder,int*endInorder);

BTree *root;

};

/*用先序遍历的方法递归构造一课二叉树*/

BTree* Tree::create_node(int level,string pos)

{

int data;

BTree *node = new BTree;

int a[]={100,99,98,97,0,0,20,0,0,10,0,0,5,1,0,0,2,0,0};

static int t=0;

cout<值为:"<

data=a[t++];

if(data == 0)

{

return NULL;

}

node->val= data;

node->left = create_node(level+1,"left");

node->right= create_node(level+1,"right");

return node;

}

void Tree::PreOrder(BTree *t)

{

if(t)

{

cout<val<

PreOrder(t->left);

PreOrder(t->right);

}

}

void Tree::InOrder(BTree *t)

{

if(t)

{

InOrder(t->left);

cout<val<

InOrder(t->right);

}

}

void Tree::PostOrder(BTree *t)

{

if(t)

{

PostOrder(t->left);

PostOrder(t->right);

cout<val<

}

}

void Tree::NonRecursivePreOrder(BTree*t)

{

if(t==NULL)

return;

stacks;

BTree *p;

p=t;

while(p||!s.empty())

{

if(p)

{

cout<val<

s.push(p);

p=p->left;

}

else{

p=s.top();

p=p->right;

s.pop();

}

}

}

void Tree::NonRecursiveInOrder(BTree*t)

{

if(t==NULL)

return;

stacks;

BTree*p;

p=t;

while(p||!s.empty())

{

if(p)

{

s.push(p);

p=p->left;

}

else

{

p=s.top();

cout<val<

p=p->right;

s.pop();

}

}

}

void Tree::NonRecursivePostOrder(BTree*t)

{

if(t==NULL)

return;

stacks;

BTree*p=t;

BTree*r;

while(p||!s.empty())

{

if(p)

{

s.push(p);

p=p->left;

}

else

{

p=s.top();

if(p->right&&p->right!=r)

{

p=p->right;

s.push(p);

p=p->left;

}

else

{

cout<val<

r=p;

s.pop();

p=NULL;

}

}

}

}

BTree* Tree::PreOrder_and_INorder_RemakeTree(int *startPreorder,int *endPreorder,int *startInorder,int*endInorder)

{

int rootValue=startPreorder[0];

BTree*root=new BTree;

root->val=rootValue;

root->left=NULL;

root->right=NULL;

//       在中序遍历中找根节点的值

int*rootInorder=startInorder;

while(rootInorder<=endInorder&&*rootInorder!=rootValue)

rootInorder++;

int leftLength=rootInorder-startInorder;

int *leftPreorderEnd=startPreorder+leftLength;

if(leftLength>0)

{

root->left=PreOrder_and_INorder_RemakeTree(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);

}

if(leftLength

{

root->right=PreOrder_and_INorder_RemakeTree(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);

}

return root;

}

BTree* binary_tree_mirror(BTree*head)

{

BTree*newHead=head;

if(head==NULL)

return NULL;

if(head->left!=NULL&&head->right!=NULL)

{

BTree *p;

p=head->left;

head->left=head->right;

head->right=p;

}

binary_tree_mirror(head->left);

binary_tree_mirror(head->right);

return newHead;

}

int main()

{

Tree tree;

tree.root = tree.create_node(1,"root");

cout<

tree.PreOrder(tree.root);

cout<

cout<

tree.NonRecursivePreOrder(tree.root);

cout<

cout<

tree.InOrder(tree.root);

cout<

cout<

tree.NonRecursiveInOrder(tree.root);

cout<

cout<

tree.PostOrder(tree.root);

cout<

cout<

tree.NonRecursivePostOrder(tree.root);

int preNum[]={100,99,98,97,20,10,5,1,2};

int InNum[]={97,98,20,99,10,100,1,5,2};

BTree*root2;

int *endPreorder=&preNum[8];

int *endInorder=&InNum[8];

root2=tree.PreOrder_and_INorder_RemakeTree(preNum,endPreorder,InNum,endInorder);

cout<

cout<

tree.PostOrder(root2);

cout<

BTree *newTree;

newTree=binary_tree_mirror(root2);

cout<

tree.PostOrder(newTree);

return 0;

}

二叉树的图:

(100)

(99)              (5)

(98)     (10)       (1)     (2)

(97)   (20)

复制代码

结果:

复制代码

please enter data:level 1 root--->值为:100

please enter data:level 2 left--->值为:99

please enter data:level 3 left--->值为:98

please enter data:level 4 left--->值为:97

please enter data:level 5 left--->值为:0

please enter data:level 5 right--->值为:0

please enter data:level 4 right--->值为:20

please enter data:level 5 left--->值为:0

please enter data:level 5 right--->值为:0

please enter data:level 3 right--->值为:10

please enter data:level 4 left--->值为:0

please enter data:level 4 right--->值为:0

please enter data:level 2 right--->值为:5

please enter data:level 3 left--->值为:1

please enter data:level 4 left--->值为:0

please enter data:level 4 right--->值为:0

please enter data:level 3 right--->值为:2

please enter data:level 4 left--->值为:0

please enter data:level 4 right--->值为:0

Pre

100 99 98 97 20 10 5 1 2

非递归前序遍历

100 99 98 97 20 10 5 1 2

In

97 98 20 99 10 100 1 5 2

非递归中序遍历

97 98 20 99 10 100 1 5 2

Post

97 20 98 10 99 1 2 5 100

非递归后序遍历

97 20 98 10 99 1 2 5 100

用后序遍历测试用前序和中序生成的二叉树:

97 20 98 10 99 1 2 5 100

镜像二叉树的后序遍历为:

2 1 5 10 20 97 98 99 100

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...相关推荐

  1. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

  2. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  3. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  4. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  5. 二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)

    17(105) 从前序与中序遍历序列构造二叉树(Medium) 描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例 例如,给出前序遍历 preorder = ...

  6. 【LeetCode】【HOT】105. 从前序与中序遍历序列构造二叉树(哈希表+递归)

    [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 文章目录 [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 package hot;import java ...

  7. 二叉树 中序遍历 python_leetcode No.105 从前序与中序遍历序列构造二叉树

    题目链接: 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树,可以假设树中没有重复的元素. 示例: 前 ...

  8. 找树左下角的值+路径总和+从前序和中序遍历序列构造二叉树(day18*)

    这篇可以主要关注一下如何确定递归时是否需要返回值. LC513. 找树左下角的值 给定一个二叉树的根节点,请找出该二叉树的 最底层最左边 节点的值. 思路1 层序遍历 class Solution:d ...

  9. 【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树

    两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...

最新文章

  1. 使用Maven原型高效创建Eclipse模块
  2. FormsAuthenticationTicket基于forms的验证
  3. 《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形
  4. 你今天volatile了吗?--慎重使用
  5. html div element,你能在TypeScript中扩展HTMLDivElement吗?
  6. RTUILabel+正则表达式
  7. google浏览器调试
  8. [转]Python中的eval()、exec()及其相关函数
  9. bat 设置变量带中文
  10. mysql_store_result和mysql_use_result
  11. 招商银行网络科技笔试
  12. Scrapy 爬取电影网站开发微信公众号
  13. Unity chan下载
  14. Temami防辐射服小贴士
  15. RPC开发系列九:优雅启动
  16. Unity3D开发:向Unity3D中导入外部模型
  17. 电子设计教程3:按键滤波电路
  18. FPGA VerilogHDL语言 数字钟 按键消抖
  19. 寻找苹果帝国的二当家
  20. 驰骋工作流引擎-督查督办系统

热门文章

  1. linux eth0 proxy arp,在interface vlan下敲no ip proxy-arp什么意思
  2. 用随机投点法计算pi值matlab,用蒙特卡洛法求圆周率PI的近似值,其算法如下:使用随机函数Rnd,随机生成两个[0,1)之间的随机数,由此构成一个投点坐标(x,y),然后根据x...
  3. php任务奖励体系,phpwind7.5完备的积分体系
  4. error C2039: “type”: 不是“cv::DataTypeT”的成员 解决办法
  5. C# 连蒙带骗不知所以然的搞定USB下位机读写
  6. 【agc004d】Teleporter
  7. 整理中短期计划和代办事情分析。
  8. EventBus的使用
  9. Hibernate学习笔记!
  10. 实数基本定理的等价证明