C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)
#include<iostream>
#include<string.h>
#include<stack>
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[]={,,,,,,,,,,,,,,,,,,};
static int t=;
cout<<"please enter data:level "<<level<<" "<<pos<<"--->值为:"<<a[t]<<endl;
data=a[t++];
if(data == )
{
return NULL;
}
node->val= data;
node->left = create_node(level+,"left");
node->right= create_node(level+,"right");
return node;
} void Tree::PreOrder(BTree *t)
{
if(t)
{
cout<<t->val<<" ";;
PreOrder(t->left);
PreOrder(t->right);
}
} void Tree::InOrder(BTree *t)
{
if(t)
{
InOrder(t->left);
cout<<t->val<<" ";;
InOrder(t->right);
}
} void Tree::PostOrder(BTree *t)
{
if(t)
{
PostOrder(t->left);
PostOrder(t->right);
cout<<t->val<<" ";
}
}
void Tree::NonRecursivePreOrder(BTree*t)
{
if(t==NULL)
return;
stack<BTree*>s;
BTree *p;
p=t;
while(p||!s.empty())
{
if(p)
{
cout<<p->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;
stack<BTree*>s;
BTree*p;
p=t;
while(p||!s.empty())
{
if(p)
{
s.push(p);
p=p->left;
}
else
{
p=s.top();
cout<<p->val<<" ";
p=p->right;
s.pop();
}
}
}
void Tree::NonRecursivePostOrder(BTree*t)
{
if(t==NULL)
return;
stack<BTree*>s;
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<<p->val<<" ";
r=p;
s.pop();
p=NULL;
}
}
} }
BTree* Tree::PreOrder_and_INorder_RemakeTree(int *startPreorder,int *endPreorder,int *startInorder,int*endInorder)
{
int rootValue=startPreorder[];
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>)
{
root->left=PreOrder_and_INorder_RemakeTree(startPreorder+,leftPreorderEnd,startInorder,rootInorder-);
}
if(leftLength<endPreorder-startPreorder)
{
root->right=PreOrder_and_INorder_RemakeTree(leftPreorderEnd+,endPreorder,rootInorder+,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(,"root");
cout<<"Pre"<<endl;
tree.PreOrder(tree.root);
cout<<endl;
cout<<"非递归前序遍历"<<endl;
tree.NonRecursivePreOrder(tree.root);
cout<<endl;
cout<<"In"<<endl;
tree.InOrder(tree.root);
cout<<endl;
cout<<"非递归中序遍历"<<endl;
tree.NonRecursiveInOrder(tree.root);
cout<<endl;
cout<<"Post"<<endl;
tree.PostOrder(tree.root);
cout<<endl;
cout<<"非递归后序遍历"<<endl;
tree.NonRecursivePostOrder(tree.root);
int preNum[]={,,,,,,,,};
int InNum[]={,,,,,,,,};
BTree*root2;
int *endPreorder=&preNum[];
int *endInorder=&InNum[];
root2=tree.PreOrder_and_INorder_RemakeTree(preNum,endPreorder,InNum,endInorder);
cout<<endl;
cout<<"用后序遍历测试用前序和中序生成的二叉树:"<<endl;
tree.PostOrder(root2);
cout<<"二叉树的镜像为:"<<endl;
BTree *newTree;
newTree=binary_tree_mirror(root2);
cout<<"镜像二叉树的后序遍历为:"<<endl;
tree.PostOrder(newTree);
return ;
}
二叉树的图:
(100)
(99) (5)
(98) (10) (1) (2)
(97) (20)
结果:
please enter data:level root--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
Pre 非递归前序遍历 In 非递归中序遍历 Post 非递归后序遍历 用后序遍历测试用前序和中序生成的二叉树: 镜像二叉树的后序遍历为:
C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)的更多相关文章
- 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [ ...
- Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树
Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...
- Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中 ...
- [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)
题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...
- LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)
题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...
- LeetCode(105):从前序与中序遍历序列构造二叉树
Medium! 题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inor ...
- 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- [Swift]LeetCode105. 从前序与中序遍历序列构造二叉树 | Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- 【LeetCode】105#从前序与中序遍历序列构造二叉树
题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...
随机推荐
- paramiko使用exec_command执行rm -rf删除目录的坑
paramiko删除目录后的上传操作请参考步骤1.2.3的说明 try: ssh = SSHClient(ip,user) sftpClient = ssh.getSftpClient() outpu ...
- HeatMap(热图)的原理和实现
先来看两张图: (1)10年世界杯决赛,冠军西班牙队中门将.后卫.中场及前锋的跑位热图 通过热图,我们可以很清楚的看出四个球员在比赛中跑动位置的差异. (2)历史地震震源位置的热图 也可以很清楚的看出 ...
- 1054. 求平均值 (20)-PAT乙级真题
今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org ...
- [转]JVM堆和栈的区别
物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记——压缩) ...
- elasticsearch学习网站
elasticsearch学习网站 https://elasticsearch.cn/
- C#对二进制文件的特定位置进行读写小结
虽然网络上关于“C#对二进制文件进行读写”的文章多如牛毛,但具体到自己要处理的问题时,难免让人产生“书到用时方恨少”和“纸上读来终觉浅”的感觉.我现在感觉要真正解决自己的问题,最终还是要靠自己下功夫. ...
- BeagleBone Black Industrial 杂谈
前言 原创文章,转载引用务必注明链接.水平有限一己拙见,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: 初版BeagleBone Black(Rev A4) ...
- Intel的东进与ARM的西征(4)--理想的星空,苹果处理器之野望
http://www.36kr.com/p/200031.html “人生五十年,如梦亦如幻.有生斯有死,壮士何所憾?”之所以没有遗憾,是因为有了理想. 公元 1582 年,日本战国时期最著名的霸主, ...
- HDU 3039 Go Home
今天本来解决的很好,本来可以不聊那么结束,但是我想更完美一点,多聊几句,谁知道就聊了很长时间,很傻逼.耽误了时间! /***************************************** ...
- ViewPagerTransforms
https://github.com/eltld/ViewPagerTransforms