码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的三种遍历方式

时间:2018-08-20 13:09:43      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:大于   子节点   get   algorithm   pre   读取   cout   根据   name   

一、二叉树的定义

二叉树(Binary Tree)的递归定义:二叉树要么为空,要么由根节点(root)、左子树(left subtree)和右子树(right subtree)组成,而左子书和右子树分别是一颗二叉树。注意,在计算机中,树一般是"倒置"的,即根在上,叶子在下。

二、二叉树的层次遍历

三种遍历方式:先序遍历、中序遍历、后序遍历(根据根节点的顺序)

PreOrder(T) = T的根节点 + PreOrder(T的左子树) + PreOrder(T的右子树)

InOrder(T) = InOrder(T的左子树) + T的根节点 + InOrder(T的右子树)

PostOrder(T) = PostOrder(左子树) + PostOrder(右子树)

其中加号表示字符串连接

这三种遍历都是递归遍历或者说深度优先遍历 (DFS,Depth-First-Search)

三、已知两种遍历方式,推出另一种遍历方式

先序+中序---->后序

后序+中序---->先序

因为后序或先序可以直接得到根节点,然后只要在中序遍历中找到,就知道左右子树的中序和后序遍历,递归下去就可以构造出二叉树了。

四、样例

(1) 题意:给一颗点带权(各权值都不相同,都是小于10000的整数)的二叉树的中序和后序遍历,找一个叶子节点使它到根的路径上的权应尽量少。

(2) 代码实现:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<string>
 6 #include<sstream>
 7 using namespace std;
 8 
 9 const int INF = 0x3f3f3f3f;
10 //因为各节点的权值各不相同且都只是整数,直接用权值作为节点编号
11 const int maxn = 10000 + 10;    
12 int in_order[maxn], post_order[maxn], lch[maxn], rch[maxn];
13 int n;
14 int best, best_sum;
15 
16 //按行读取数据,并存到数组中
17 bool read_list(int *a)
18 {
19     string line;
20     if (!getline(cin, line))  return false;
21     stringstream ss(line);
22     n = 0;
23     int x;
24     while (ss >> x)  a[n++] = x;
25     return n > 0;
26 }
27 
28 //把in_order[L1,R1]和post_order[L2,R2]建成一棵二叉树,返回树根
29 int build(int L1, int R1, int L2, int R2)
30 {
31     if (L2 > R2)  return 0;  //空树
32     int root = post_order[R2];
33     int pos = L1;
34     while (in_order[pos] != root)  pos++;
35     int cnt = pos - L1;
36     lch[root] = build(L1, pos - 1, L2, L2 + cnt - 1);
37     rch[root] = build(pos + 1, R1, L2 + cnt, R2 - 1);
38     return root;
39 }
40 
41 //从根节点出发,中序遍历,查找最小值
42 void dfs(int u, int sum)
43 {
44     sum += u;
45 
46     //到达叶子节点,循环终止
47     if (!lch[u] && !rch[u])
48     {
49         if (sum < best_sum)
50         {
51             best = u;
52             best_sum = sum;
53         }
54         return;
55     }
56 
57     //加了个剪枝:如果当前的和大于当前的最小和,就不必从这条路继续搜
58     if (lch[u] && sum < best_sum)  dfs(lch[u], sum);
59     if (rch[u] && sum < best_sum)  dfs(rch[u], sum);
60 }
61 
62 int main()
63 {
64     while (read_list(in_order))
65     {
66         read_list(post_order);
67         build(0, n - 1, 0, n - 1);
68 
69         best_sum = INF;
70         dfs(post_order[n - 1], 0);
71         cout << best << endl;
72     }
73     return 0;
74 }

 

二叉树的三种遍历方式

标签:大于   子节点   get   algorithm   pre   读取   cout   根据   name   

原文地址:https://www.cnblogs.com/lfri/p/9504865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!