日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

树的遍历和代码实现

發(fā)布時(shí)間:2024/9/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树的遍历和代码实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

假如現(xiàn)在有一棵樹(shù),如圖:

樹(shù)的遍歷主要分為前序遍歷、中序遍歷和后序遍歷。上面圖的樹(shù)遍歷結(jié)果如下:

前序遍歷:532468

中序遍歷:234568

后序遍歷:243865

?

可以簡(jiǎn)單理解(不嚴(yán)謹(jǐn)):以根節(jié)點(diǎn)為參考點(diǎn),前序遍歷是根節(jié)點(diǎn)首先輸出,然后左子樹(shù)輸出,最后右子樹(shù)輸出;中序遍歷是左子樹(shù)先輸出,根節(jié)點(diǎn)在中間輸出,右子樹(shù)最后輸出;后續(xù)遍歷是左子樹(shù),右子樹(shù),最后根節(jié)點(diǎn)最后輸出。

這里以中序遍歷分析一下:

1、首先遍歷根節(jié)點(diǎn),有左子樹(shù),所以遍歷左子樹(shù)3

2、3有左子樹(shù),所以遍歷左子樹(shù)2

3、2遍歷左子樹(shù)為null,所以返回2,然后輸出2

4、接著遍歷2的右子樹(shù),為null,返回2后,在返回3,接著輸出3

5、然后遍歷右子樹(shù)4,4的左子樹(shù)為null,返回4,接著輸出4,然后接著遍歷4的右子樹(shù),為null,然后返回3,再返回5,輸出5.

6、返回5后,再遍歷5的右子樹(shù),遍歷和上面類(lèi)似。最終輸出:234568

代碼如下:

import java.util.Stack;public class BST<E extends Comparable<E>> {private class Node {public E e;public Node left, right;public Node(E e) {this.e = e;left = null;right = null;}}private Node root;private int size;public BST(){root = null;size = 0;}public int size(){return size;}public boolean isEmpty(){return size == 0;}// 向二分搜索樹(shù)中添加新的元素epublic void add(E e){root = add(root, e);}// 向以node為根的二分搜索樹(shù)中插入元素e,遞歸算法// 返回插入新節(jié)點(diǎn)后二分搜索樹(shù)的根private Node add(Node node, E e){if(node == null){size ++;return new Node(e);}if(e.compareTo(node.e) < 0)node.left = add(node.left, e);else if(e.compareTo(node.e) > 0)node.right = add(node.right, e);return node;}// 看二分搜索樹(shù)中是否包含元素epublic boolean contains(E e){return contains(root, e);}// 看以node為根的二分搜索樹(shù)中是否包含元素e, 遞歸算法private boolean contains(Node node, E e){if(node == null)return false;if(e.compareTo(node.e) == 0)return true;else if(e.compareTo(node.e) < 0)return contains(node.left, e);else // e.compareTo(node.e) > 0return contains(node.right, e);}// 二分搜索樹(shù)的前序遍歷public void preOrder(){System.out.print("前序遍歷:");preOrder(root);}// 前序遍歷以node為根的二分搜索樹(shù), 遞歸算法private void preOrder(Node node){if(node == null)return;System.out.print(node.e + " ");preOrder(node.left);preOrder(node.right);}// 二分搜索樹(shù)的中序遍歷public void inOrder(){System.out.print("中序遍歷:");inOrder(root);}// 中序遍歷以node為根的二分搜索樹(shù), 遞歸算法private void inOrder(Node node){if(node == null)return;inOrder(node.left);System.out.print(node.e + " ");inOrder(node.right);}// 二分搜索樹(shù)的后序遍歷public void postOrder(){System.out.print("后序遍歷:");postOrder(root);}// 后序遍歷以node為根的二分搜索樹(shù), 遞歸算法private void postOrder(Node node){if(node == null)return;postOrder(node.left);postOrder(node.right);System.out.print(node.e + " ");}@Overridepublic String toString(){StringBuilder res = new StringBuilder();generateString(root, 0, res);return res.toString();}// 生成以node為根節(jié)點(diǎn),深度為depth的描述二叉樹(shù)的字符串private void generateString(Node node, int depth, StringBuilder res){if(node == null){res.append(generateDepthString(depth) + "null\n");return;}res.append(generateDepthString(depth) + node.e + "\n");generateString(node.left, depth + 1, res);generateString(node.right, depth + 1, res);}private String generateDepthString(int depth){StringBuilder res = new StringBuilder();for(int i = 0 ; i < depth ; i ++)res.append("--");return res.toString();} } BST<Integer> bst = new BST<>();int[] nums = {5, 3, 6, 8, 4, 2};for(int num: nums)bst.add(num);bst.preOrder();System.out.println();bst.inOrder();System.out.println();bst.postOrder();System.out.println();/*output:前序遍歷:5 3 2 4 6 8 中序遍歷:2 3 4 5 6 8 后序遍歷:2 4 3 8 6 5 */

用遞歸,進(jìn)行深度遍歷。

轉(zhuǎn)載于:https://www.cnblogs.com/luoa/p/10839731.html

總結(jié)

以上是生活随笔為你收集整理的树的遍历和代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。