18.2.26 codevs3143 二叉树的序遍历

题目描述 Description

求一棵二叉树的前序遍历,中序遍历和后序遍历

输入描述 Input Description

第一行一个整数n,表示这棵树的节点个数。

接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。

输出描述 Output Description

输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。

样例输入 Sample Input

5

2 3

4 5

0 0

0 0

0 0

样例输出 Sample Output

1 2 4 5 3

4 2 5 1 3

4 5 2 3 1

数据范围及提示 Data Size & Hint

n <= 16

  1 #include <iostream>
  2 #include <string.h>
  3 #include <math.h>
  4
  5 using namespace std;
  6 int tree[20][3],tree1[20][3]={0},tree2[20][3]={0},tree3[20][3]={0};
  7 int visited1[20]={0},visited2[20]={0},visited3[20]={0};
  8 int flag2=0,flag3=0;
  9
 10 void forw(int n)//前序遍历
 11 {
 12     if(!visited1[n])
 13     {
 14         if(n!=1)
 15             cout<<" ";
 16         cout<<n;
 17         visited1[n]=1;
 18     }
 19     if(tree1[n][1]+tree1[n][2]==0)
 20         return;
 21     else if(tree1[n][1]==0)
 22     {
 23         int tmp=n;
 24         n=tree1[n][2];
 25         forw(n);
 26         tree1[tmp][2]=0;
 27         n=tmp;
 28         return;
 29     }
 30     else
 31     {
 32         int tmp=n;
 33         n=tree1[n][1];
 34         forw(n);
 35         tree1[tmp][1]=0;
 36         n=tmp;
 37         forw(n);
 38     }
 39 }
 40
 41 void mid(int n)//中序遍历
 42 {
 43     if(visited2[tree2[n][1]])
 44     {
 45         if(flag2)
 46            cout<<" ";
 47         flag2=1;
 48         cout<<n;
 49         visited2[n]=1;
 50     }
 51     if(tree2[n][1]+tree2[n][2]==0)
 52     {
 53         if(flag2)
 54            cout<<" ";
 55         flag2=1;
 56         cout<<n;
 57         visited2[n]=1;
 58         return;
 59     }
 60     else if(visited2[tree2[n][1]]&&visited2[tree2[n][2]])
 61         return;
 62     else if(tree2[n][1]==0)
 63     {
 64         if(flag2)
 65            cout<<" ";
 66         flag2=1;
 67         cout<<n;
 68         visited2[n]=1;
 69         int tmp=n;
 70         n=tree2[n][2];
 71         mid(n);
 72         tree2[tmp][2]=0;
 73         n=tmp;
 74         return;
 75     }
 76     else
 77     {
 78         int tmp=n;
 79         n=tree2[n][1];
 80         mid(n);
 81         tree2[tmp][1]=0;
 82         n=tmp;
 83         mid(n);
 84     }
 85 }
 86
 87 void backw(int n)//后序遍历
 88 {
 89     if((visited3[tree3[n][1]]||!tree3[n][1])&&(visited3[tree3[n][2]]||!tree3[n][2]))
 90     {
 91         if(flag3)
 92            cout<<" ";
 93         flag3=1;
 94         cout<<n;
 95         visited3[n]=1;
 96         return;
 97     }
 98     if(!tree3[n][1]||visited3[tree3[n][1]])
 99     {
100         backw(tree3[n][2]);
101         backw(n);
102     }
103     else
104     {
105         backw(tree3[n][1]);
106         backw(n);
107     }
108 }
109
110 int main()
111 {
112     int n;
113     cin>>n;
114     for(int i=1;i<=n;i++)
115     {
116         cin>>tree1[i][1];
117         tree2[i][1]=tree1[i][1];
118         tree3[i][1]=tree2[i][1];
119         cin>>tree1[i][2];
120         tree2[i][2]=tree1[i][2];
121         tree3[i][2]=tree2[i][2];
122     }
123     forw(1);
124     cout<<endl;
125     mid(1);
126     cout<<endl;
127     backw(1);
128     cout<<endl;
129     return 0;
130 }

前中后序遍历实质上是把根部放在左右儿子前面,中间,后面输出。

原文地址:https://www.cnblogs.com/yalphait/p/8471708.html

时间: 2024-10-08 07:10:39

18.2.26 codevs3143 二叉树的序遍历的相关文章

codevs3143 二叉树的序遍历

难度等级:白银 3143 二叉树的序遍历 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号. 输出描述 Output Description 输出一共三行,分别为前序遍历,中序遍历和后序遍历.编号之间用空格隔开. 样例输入 Sample Input 5 2 3 4 5 0 0 0 0

*题目记录 codevs3143 二叉树的序遍历

#include<stdio.h> typedef struct node{ int boo; struct node *chil; int l; struct node *chir; int r; }; int bl(node *p); int bj(node *q); int bk(node *r); int main(){ struct node k[16]; int n; scanf("%d",&n); for(int i=1;i<=n;i++){ k

3143 二叉树的序遍历

3143 二叉树的序遍历 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号. 输出描述 Output Description 输出一共三行,分别为前序遍历,中序遍历和后序遍历.编号之间用空格隔开

94 Binary Tree Inorder Traversal(二叉树中序遍历Medium)

题目意思:二叉树中序遍历,结果存在vector<int>中 解题思路:迭代 迭代实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Soluti

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

二叉树中序遍历 (C语言实现)

在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 如下是实现创建二叉树和二叉树中序遍历的代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <memory.h> 4 5 t

144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)

题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: 1 class Solution { 2 public: 3 vector<int> preorderTraversal(TreeNode* root) { 4 vector<int> ans; 5 if(root){ 6 TreeNode* temp; 7 stack<TreeNode*> s; //利用栈,

数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2 abdegcf dbgeaf

数据结构_二叉树先序遍历

/* 二叉树先序遍历 思路: 1,先访问当前结点,将其入栈(其可能有右孩子) 2,若其存在左结点,执行1 3,若不存在左结点,则将栈顶元素出栈,若其不存在右孩子,继续出栈,若有右孩子,执行1 */ void pre_Order(BTree T) { InitStack(S); BiTree pCur=T; while(pCur || !IsEmpty(S)) //这里的IsEmpty好像不需要 { visit(pCur); Push(S,pCur); pCur = pCur->lchild; w