二叉树、多叉树子路径遍历

简介:
 1 /// <summary>
2 /// 二叉树
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 class Road<T>
6 {
7 T data;
8 Road<T> Lnode, rnode, pnode;
9 public T Data
10 {
11 get { return data; }
12 set { data = value; }
13 }
14 public Road<T> LNode
15 {
16 get { return Lnode; }
17 set { Lnode = value; }
18 }
19 public Road<T> RNode
20 {
21 get { return rnode; }
22 set { rnode = value; }
23 }
24 public Road<T> PNode
25 {
26 get { return pnode; }
27 set { pnode = value; }
28 }
29 public Road() { }
30 public Road(T data)
31 {
32 this.data = data;
33 }
34 }
35
36 class 叉树测试
37 {
38 // 测试的主方法
39 static void Main( string[] args)
40 {
41 Road<string> rootNode = BinTree();
42 Stack<string> stack = new Stack<string>();
43 findPathNode<string>(rootNode, stack);
44 Console.WriteLine("");
45
46 RoadLink< string> roadNode = BinRoad();
47 Stack< string> roadStack = new Stack< string>();
48 findPath< string>(roadNode, roadStack);
49 Console.WriteLine( " over ");
50 Console.Read();
51 }
52
53 static Road< string> BinTree()
54 {
55 Road< string>[] binTree = new Road< string>[ 8];
56
57 // 创建节点
58 binTree[ 0] = new Road< string>( " A ");
59 binTree[ 1] = new Road< string>( " B ");
60 binTree[ 2] = new Road< string>( " C ");
61 binTree[ 3] = new Road< string>( " D ");
62 binTree[ 4] = new Road< string>( " E ");
63 binTree[ 5] = new Road< string>( " F ");
64 binTree[ 6] = new Road< string>( " G ");
65 binTree[ 7] = new Road< string>( " H ");
66
67 // 使用层次遍历二叉树的思想,构造一个已知的二叉树
68 binTree[ 0].LNode = binTree[ 1];
69 binTree[ 0].RNode = binTree[ 2];
70 binTree[ 1].RNode = binTree[ 3];
71 binTree[ 2].LNode = binTree[ 4];
72 binTree[ 2].RNode = binTree[ 5];
73 binTree[ 3].LNode = binTree[ 6];
74 binTree[ 3].RNode = binTree[ 7];
75
76 // 返回二叉树根节点
77 return binTree[ 0];
78 }
79
80 static void findPathNode<T>(Road<T> root, Stack<T> stack)
81 {
82 if (root == null)
83 {
84 return;
85 }
86 // 把当前结点进栈
87 stack.Push(root.Data);
88 // 如果是叶子结点,而且和为给定的值,则打印路径
89 bool isLeaf = root.LNode == null && root.RNode == null;
90 if (isLeaf)
91 {
92 List< object> tmpDatas = new List< object>();
93 foreach ( var item in stack)
94 {
95 tmpDatas.Add(item);
96 }
97 tmpDatas.Reverse();
98
99 foreach ( var item in tmpDatas)
100 {
101 Console.Write(item + " - ");
102 }
103 Console.WriteLine( "");
104
105 }
106
107 // 如果不是叶子结点,则遍历它的子结点
108 if (root.LNode != null)
109 {
110 findPathNode(root.LNode, stack);
111 }
112 if (root.RNode != null)
113 {
114 findPathNode(root.RNode, stack);
115 }
116 // 在返回到父结点之前,在路径上删除当前结点
117 stack.Pop();
118 }
119
120 static RoadLink< string> BinRoad()
121 {
122 RoadLink< string>[] binTree = new RoadLink< string>[ 10];
123
124 // 创建节点
125 binTree[ 0] = new RoadLink< string>( " A ");
126 binTree[ 1] = new RoadLink< string>( " B ");
127 binTree[ 2] = new RoadLink< string>( " C ");
128 binTree[ 3] = new RoadLink< string>( " D ");
129 binTree[ 4] = new RoadLink< string>( " E ");
130 binTree[ 5] = new RoadLink< string>( " F ");
131 binTree[ 6] = new RoadLink< string>( " G ");
132 binTree[ 7] = new RoadLink< string>( " H ");
133 binTree[ 8] = new RoadLink< string>( " I ");
134 binTree[ 9] = new RoadLink< string>( " J ");
135
136 // 使用层次遍历二叉树的思想,构造一个已知的二叉树
137 binTree[ 0].SubRoads = new List< object>();
138 binTree[ 0].SubRoads.Add(binTree[ 1]);
139 binTree[ 0].SubRoads.Add(binTree[ 2]);
140
141 binTree[ 1].SubRoads = new List< object>();
142 binTree[ 1].SubRoads.Add(binTree[ 3]);
143
144 binTree[ 2].SubRoads = new List< object>();
145 binTree[ 2].SubRoads.Add(binTree[ 3]);
146
147 binTree[ 3].SubRoads = new List< object>();
148 binTree[ 3].SubRoads.Add(binTree[ 4]);
149 binTree[ 3].SubRoads.Add(binTree[ 5]);
150 binTree[ 3].SubRoads.Add(binTree[ 7]);
151
152 binTree[ 4].SubRoads = new List< object>();
153 binTree[ 4].SubRoads.Add(binTree[ 6]);
154
155 binTree[ 5].SubRoads = new List< object>();
156 binTree[ 5].SubRoads.Add(binTree[ 6]);
157
158 binTree[ 7].SubRoads = new List< object>();
159 binTree[ 7].SubRoads.Add(binTree[ 8]);
160 binTree[ 7].SubRoads.Add(binTree[ 9]);
161
162 binTree[ 8].SubRoads = new List< object>();
163 binTree[ 8].SubRoads.Add(binTree[ 6]);
164
165 binTree[ 9].SubRoads = new List< object>();
166 binTree[ 9].SubRoads.Add(binTree[ 6]);
167
168 // 返回二叉树根节点
169 return binTree[ 0];
170 }
171
172 static void findPath<T>(RoadLink<T> root, Stack<T> stack)
173 {
174 if (root == null)
175 {
176 return;
177 }
178 // 把当前结点进栈
179 stack.Push(root.Data);
180 // 如果是叶子结点,而且和为给定的值,则打印路径
181 bool isLeaf = root.SubRoads == null;
182 // bool isLeaf = root.Data.Equals("E"); // 寻找的点
183 if (isLeaf)
184 {
185 List< object> tmpDatas = new List< object>();
186 foreach ( var item in stack)
187 {
188 tmpDatas.Add(item);
189 }
190 tmpDatas.Reverse();
191
192 foreach ( var item in tmpDatas)
193 {
194 Console.Write(item + " - ");
195 }
196 Console.WriteLine( "");
197
198 }
199 // 如果不是叶子结点,则遍历它的子结点
200 if (root.SubRoads != null)
201 {
202 foreach ( var item in root.SubRoads)
203 {
204 var obj = item as RoadLink<T>;
205 findPath(obj, stack);
206 }
207
208 }
209 // 在返回到父结点之前,在路径上删除当前结点
210 stack.Pop();
211 }
212 }
213
214 /// <summary>
215 /// 多叉树
216 /// </summary>
217 /// <typeparam name="T"></typeparam>
218 class RoadLink<T>
219 {
220 T data;
221 /// <summary>
222 /// 子节点
223 /// </summary>
224 List< object> subRoads = null;
225 public T Data
226 {
227 get { return data; }
228 set { data = value; }
229 }
230 /// <summary>
231 /// 子节点
232 /// </summary>
233 public List< object> SubRoads
234 {
235 get { return subRoads; }
236 set { subRoads = value; }
237 }
238 public RoadLink() { }
239 public RoadLink(T data)
240 {
241 this.data = data;
242 }
243
244 public void AddSubRoad( object subRoad)
245 {
246 if (subRoads == null) subRoads = new List< object>();
247 if (subRoads.Contains(subRoad)) subRoads.Add(subRoad);
248 }
249 }



本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/4762802.html,如需转载请自行联系原作者
相关文章
|
4月前
二叉树查找值为x的结点、树的高度、第k层结点个数的代码实现
二叉树查找值为x的结点、树的高度、第k层结点个数的代码实现
|
2月前
|
测试技术
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
|
7月前
|
存储 算法
二叉树的创建和遍历
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分
62 0
数组转树形结构(递归)
大家好,今天我将向大家分享一下数组转树形结构的方法——递归方法。
|
10月前
递归删除树节点
递归删除树节点
37 0
|
11月前
树的遍历
树的遍历
二叉树的创建,和三种递归遍历方式
二叉树的创建,和三种递归遍历方式
二叉查找树的建立,删除,非递归和递归查找给定元素,非递归和递归查找最大元素结点和最小元素结点
二叉查找树的建立,删除,非递归和递归查找给定元素,非递归和递归查找最大元素结点和最小元素结点
|
Java
输入一棵二叉树,判断该二叉树是否是平衡二叉树(Java版)/输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。(Java版)
输入一棵二叉树,判断该二叉树是否是平衡二叉树(Java版)/输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。(Java版)
103 0