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 ...
随机推荐
- Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)
以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_deployment_automation.html ...
- php执行超时(nginx,linux环境)
与下面的参数有关 nginx: fastcgi_connect_timeout fastcgi_read_timeout fastcgi_send_timeout php-fpm:request_te ...
- PostgreSQL SystemTap on Linux
http://digoal126.wap.blog.163.com/w2/blogDetail.do;jsessionid=3949B03DE151DA0E55D807466C5E630B.yqblo ...
- js -- 监听窗口的大小变化
- 应用程序中的server错误,没有名称为“ServiceBehavior”的服务行为
应用程序中的server错误,没有名称为"ServiceBehavior"的服务行为 今天在阅读"创建和使用Web服务"的相关内容,在浏览器中查 ...
- PHP接收参数的几种方式
PHP5在默认的情况下接收参数是需要使用 $_GET['value']; $_POST['value']; 还可以在PHP.ini 文件中的 将register_globals = Off 改re ...
- ansible 基本命令学习与踩坑
1. 命令行参数 -v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv) -i PATH,–inventory=PATH 指定host文件的路径,默认是在/ ...
- HDU 1423 Greatest Common Increasing Subsequence(LICS入门,只要求出最长数)
Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)
一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数.后一种方式对于使用Zookeeper等加载属性的方式很方便. 1. 加载配置文件: ...
- 2016-1-8 windows 7下安装mysql及其配置和运用
绪言 最近学习了一下mysql的相关用法,以及vs2010结合mysql的使用. 遇到的问题:1.安装mysql 5.6 绿色免安装版本,出现mysql server not connect loca ...