树的一些操作——遍历,前序和中序建立后续

  1 #include <iostream>
  2 #include <cstring>
  3 #include <stack>
  4 #include <queue>
  5 #include <cmath>
  6 #include <exception>
  7 #include <stdexcept>
  8
  9 using namespace std;
 10
 11 typedef struct Node {
 12     int key;
 13     struct Node *left;
 14     struct Node *right;
 15 }Node;
 16
 17
 18 void PreOrder(Node* head) {
 19     if(head) {
 20         cout<<head->key<<"\t";
 21         PreOrder(head->left);
 22         PreOrder(head->right);
 23     }
 24 }
 25
 26 void InOrder(Node* head) {
 27     if(head) {
 28         InOrder(head->left);
 29         cout<<head->key<<"\t";
 30         InOrder(head->right);
 31     }
 32 }
 33
 34 void PostOrder(Node* head) {
 35     if(head) {
 36         PostOrder(head->left);
 37         PostOrder(head->right);
 38         cout<<head->key<<"\t";
 39     }
 40 }
 41
 42 void IterInOrder(Node* head) {
 43     stack<Node*> ss;
 44     Node* headCp = head;
 45     for(;;) {
 46         for(;headCp;headCp=headCp->left) {
 47             ss.push(headCp);
 48         }
 49         if(ss.size()!=0) { // key point, if stack is of no item inside, top() will cause trouble.
 50             headCp = ss.top();
 51             ss.pop();
 52         }
 53         if(!headCp) {
 54             break;
 55         }
 56         cout<<headCp->key<<"\t";
 57         headCp = headCp->right;
 58     }
 59 }
 60
 61 void LevelOrder(Node* head) {
 62     queue<Node*> que;
 63     if(!head) {
 64         return;
 65     }
 66     que.push(head);
 67     for(;;) {
 68         if(que.size()==0) {
 69             break;
 70         }
 71         head = que.front();
 72         que.pop();
 73         if(head) {
 74             cout<<head->key<<"\t";
 75             if(head->left) {
 76                 que.push(head->left);
 77             }
 78             if(head->right) {
 79                 que.push(head->right);
 80             }
 81         }
 82     }
 83 }
 84
 85 Node* BuildTree(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder);
 86
 87 Node* ConstructNewTree(int* PreOrderArr, int* InOrderArr, int length) {
 88         if(PreOrderArr == NULL || InOrderArr == NULL || length == 0) {
 89             return NULL;
 90         } else {
 91             int* startPreorder = PreOrderArr;
 92             int* endPreorder = PreOrderArr+length-1;
 93             int* startInorder = InOrderArr;
 94             int* endInorder = InOrderArr+length-1;
 95             return BuildTree(startPreorder,endPreorder,startInorder,endInorder);
 96         }
 97 }
 98
 99 Node* BuildTree(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder) {
100     int rootValue = -1;
101     if(startPreorder == NULL || endPreorder==NULL || startInorder==NULL || endInorder==NULL) {
102         return NULL;
103     } else {
104         rootValue = *startPreorder;
105     }
106     Node* root = new Node();
107     root->key = rootValue;
108     root->left = NULL;
109     root->right = NULL;
110
111     if(startPreorder==endPreorder) {
112         if(startInorder==endInorder && *startPreorder == *startInorder) {
113             return root;
114         } else {
115             throw exception();
116         }
117     }
118
119     int* rootInorder = startInorder;
120     while(rootInorder<=endInorder && *rootInorder!=rootValue) {
121         rootInorder++;
122     }
123     if(*rootInorder!=rootValue) {
124         throw exception();
125     }
126     int leftLen = rootInorder-startInorder;
127     int righLen = endInorder-rootInorder;
128     int* leftPreorderEnd = startPreorder+leftLen;
129     if(leftLen>0) {
130         root->left = BuildTree(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
131     }
132     if(righLen>0) {
133         root->right = BuildTree(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
134     }
135     return root;
136 }
137
138
139 int main(int argc, char* argv[]) {
140     Node node1,node2,node3,node4,node5,node6,node7,node8;
141
142     node1.key = 1;
143     node1.left = &node2;
144     node1.right = &node3;
145
146     node2.key = 2;
147     node2.left = &node4;
148     node2.right = NULL;
149
150     node3.key = 3;
151     node3.left = &node5;
152     node3.right = &node6;
153
154     node4.key = 4;
155     node4.left = NULL;
156     node4.right = &node7;
157
158     node5.key = 5;
159     node5.left = NULL;
160     node5.right = NULL;
161
162     node6.key = 6;
163     node6.left = &node8;
164     node6.right = NULL;
165
166     node7.key = 7;
167     node7.left = NULL;
168     node7.right = NULL;
169
170     node8.key = 8;
171     node8.left = NULL;
172     node8.right = NULL;
173
174     cout<<"preorder:"<<endl;
175     PreOrder(&node1);
176     cout<<endl;
177
178     cout<<"inorder:"<<endl;
179     InOrder(&node1);
180     cout<<endl;
181
182
183 /*
184     cout<<"PreOrder:\n";
185     PreOrder(&node1);
186     cout<<endl;
187
188     cout<<"recursive InOrder:\n";
189     InOrder(&node1);
190     cout<<endl;
191
192     cout<<"loop InOrder:\n";
193     IterInOrder(&node1);
194     cout<<endl;
195
196     cout<<"PostOrder:\n";
197     PostOrder(&node1);
198     cout<<endl;
199
200     cout<<"Level Order:\n";
201     LevelOrder(&node1);
202     cout<<endl;
203 */
204
205     cout<<"start building the tree ..."<<endl;
206     int PreorderArr[] = {1,2,4,7,3,5,6,8};
207     int InorderArr[] = {4,7,2,1,5,3,8,6};
208     Node* root = ConstructNewTree(PreorderArr,InorderArr,sizeof(PreorderArr)/sizeof(int));
209     cout<<"build done."<<endl;
210
211     cout<<"preorder:"<<endl;
212     PreOrder(root);
213     cout<<endl;
214     cout<<"inorder:"<<endl;
215     InOrder(root);
216     cout<<endl;
217     cout<<"postorder:"<<endl;
218     PostOrder(root);
219     cout<<endl;
220
221     return 0;
222 }
时间: 2024-11-09 12:43:22

树的一些操作——遍历,前序和中序建立后续的相关文章

树的非递归遍历——前序、中序、后序

树的递归遍历非常简单,也是写树的遍历时最常用的写法.但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下. Leetcode对应习题:前序,中序,后序. 相对而言,这三种非递归遍历的难度--前序 < 中序 < 后序. 对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历. 树的非递归前序: 1 class Solution { 2 public: 3 vector

java实现线索化二叉树的前序、中序、后续的遍历(完整代码)

java实现线索化二叉树的前序.中序.后续的遍历 比如创建一个二叉树 1 / 3 6 / \ / 8 10 14 线索化二叉树几个概念: n个节点的二叉链表中含有n+1 [公式2n-(n-1)=n+1]个空指针域.利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加指针成为线索).如下面的就是6+1=7个空指针域 (8,10,14各有连个指针没有指向 6有一个) 加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树.分为前序线索二叉树.中序线索二叉树.

java 根据二叉树前序 ,中序求后续

在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果. 我们知道: 前序遍历方式为:根节点->左子树->右子树 中序遍历方式为:左子树->根节点->右子树 后序遍历方式为:左子树->右子树->根节点 从这里可以看出,前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果.因此,通过这个分析,可以恢复这棵二叉树

二叉树的遍历——前序,中序,后序,层序

二叉树的遍历原因:将序列编程图或者二叉树的形式,确实很直观.但是,最终的处理是交给计算机,计算机的处理只有判断.循环等,也就是只可以处理先行序列.而二叉树的遍历就是将序列的树结构编程线性序列,将线性序列交给计算机处理. 二叉树的遍历大致分为四种:前序遍历.中序遍历.后序遍历,层序遍历. 前序遍历(从上向下):从根节点开始并且取根节点值,遍历根节点的所有左子树以及左子树的所有节点,然后再进行根节点的右子树的遍历.需要注意一点,二叉树的遍历利用递归的思想,也就是每个节点都是根节点,大哥比方,0层的根

二叉树的前序,中序及后续遍历

前序遍历:先访问跟结点,然后遍历左子树,最后遍历右子树.即"根左右". 实现代码: class Solution { public: vector<int> preorderTraversal(TreeNode *root) { if (root==NULL) { return vector<int>(); } vector<int> result; stack<TreeNode *> treeStack; treeStack.push(

二叉树的建立,非递归前序、中序、后续遍历

算法网上很多,这里只是我手写的可执行的代码,备份用. #include <iostream> #include <vector> #include<queue> using namespace std; struct node {     char element; struct node * left; struct node * right; //struct node * parent; node (char a) { element = a; } }; stru

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

c++树,知道前序和中序求后序遍历

经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依照从做左到右的顺序,比如前序就是:中->左->右,中序就是:左->中->右. 现在前序是:ABDGCEFH 中序是:DGBAECHF 想要求后序就要把树重建出来,我们理一下思路. 1.由前序遍历的性质可以知道A必然是树的根节点 2.中序遍历中A之前的就肯定是A的左子树,A后面的就是A的

树的前序、中序、后序遍历的JAVA实现

[注]后续实现第二种方法暂时未解出 1 package com.exe4.offer; 2 3 import java.util.Stack; 4 5 /** 6 * 前序.中序.后序遍历方法 7 * @author WGS 8 * 9 */ 10 public class BianliOfBinarryTree { 11 public static class TreeNode { 12 int val = 0; 13 TreeNode left = null; 14 TreeNode rig