国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中創建二叉樹并實現三種遍歷方式

2019-11-07 23:21:02
字體:
來源:轉載
供稿:網友

由上一篇二叉樹詳解中,我們知道根據前序中序或中序后序,可以還原二叉樹,這里主要說二叉樹的三種遍歷方式

1、二叉樹的創建

此處由前序后中序還原二叉樹,代碼如下先定義個一個TreeNode.java
 public class TreeNode {      int val;      TreeNode left;      TreeNode right;      TreeNode(int x) { val = x; }  }

還原二叉樹

public TreeNode reConstructBinaryTree(int[] PRe, int[] in) {		if (pre == null || in == null) {			return null;		}		HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();		for (int i = 0; i < in.length; i++) {			hashMap.put(in[i], i);		}		return preIn(pre, 0, pre.length - 1, in, 0, in.length - 1, hashMap);	}	// 根據前序和中序還原二叉樹	public TreeNode preIn(int[] p, int pi, int pj, int[] n, int ni, int nj,			HashMap<Integer, Integer> map) {		if (pi > pj) {			return null;		}		TreeNode head = new TreeNode(p[pi]);		int index = map.get(p[pi]);		// 根據前序遍歷知道根節點,根據中序遍歷知道根左邊的為左子樹,右邊的為右子樹		head.left = preIn(p, pi + 1, pi + index - ni, n, ni, index - 1, map);		head.right = preIn(p, pi + index - ni + 1, pj, n, index + 1, nj, map);		System.out				.println("head =" + (head != null ? head.val : " ")						+ " head.left ="						+ (head.left != null ? head.left.val : " ")						+ " head.right ="						+ (head.right != null ? head.right.val : " "));		return head;	}

2、前序遍歷

	// 根左右	public void preorderTraversa(TreeNode node) {		if (node == null) {			return;		}		System.out.print(node.val + " ");		preorderTraversa(node.left);		preorderTraversa(node.right);	}

3、中序遍歷

	// 左根右	public void inorderTraversa(TreeNode node) {		if (node == null) {			return;		}		inorderTraversa(node.left);		System.out.print(node.val + " ");		inorderTraversa(node.right);	}

4、后序遍歷

	// 左右根	public void postorderTraversa(TreeNode node) {		if (node == null) {			return;		}		postorderTraversa(node.left);		postorderTraversa(node.right);		System.out.print(node.val + " ");	}

5、具體調用代碼如下

import java.util.HashMap;public class BinaryTree {	public static void main(String[] args) {		int pre[] = { 1, 2, 4, 7, 3, 5, 6, 8 };		int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 };		BinaryTree binaryTree = new BinaryTree();		// 利用前序和中序,創建二叉樹		TreeNode treeNode = binaryTree.reConstructBinaryTree(pre, in);		// 前序遍歷二叉樹		binaryTree.preorderTraversa(treeNode);		System.out.println();		// 中序遍歷		binaryTree.inorderTraversa(treeNode);		System.out.println();		// 后序遍歷		binaryTree.postorderTraversa(treeNode);	}	// 左右根	public void postorderTraversa(TreeNode node) {		if (node == null) {			return;		}		postorderTraversa(node.left);		postorderTraversa(node.right);		System.out.print(node.val + " ");	}	// 根左右	public void preorderTraversa(TreeNode node) {		if (node == null) {			return;		}		System.out.print(node.val + " ");		preorderTraversa(node.left);		preorderTraversa(node.right);	}	// 左根右	public void inorderTraversa(TreeNode node) {		if (node == null) {			return;		}		inorderTraversa(node.left);		System.out.print(node.val + " ");		inorderTraversa(node.right);	}	public TreeNode reConstructBinaryTree(int[] pre, int[] in) {		if (pre == null || in == null) {			return null;		}		HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();		for (int i = 0; i < in.length; i++) {			hashMap.put(in[i], i);		}		return preIn(pre, 0, pre.length - 1, in, 0, in.length - 1, hashMap);	}	// 根據前序和中序還原二叉樹	public TreeNode preIn(int[] p, int pi, int pj, int[] n, int ni, int nj,			HashMap<Integer, Integer> map) {		if (pi > pj) {			return null;		}		TreeNode head = new TreeNode(p[pi]);		int index = map.get(p[pi]);		// 根據前序遍歷知道根節點,根據中序遍歷知道根左邊的為左子樹,右邊的為右子樹		head.left = preIn(p, pi + 1, pi + index - ni, n, ni, index - 1, map);		head.right = preIn(p, pi + index - ni + 1, pj, n, index + 1, nj, map);		System.out				.println("head =" + (head != null ? head.val : " ")						+ " head.left ="						+ (head.left != null ? head.left.val : " ")						+ " head.right ="						+ (head.right != null ? head.right.val : " "));		return head;	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平安县| 辽源市| 枝江市| 嘉定区| 兴宁市| 枣阳市| 大余县| 南涧| 镇赉县| 贵州省| 恭城| 梓潼县| 云龙县| 谷城县| 和平区| 锡林郭勒盟| 东山县| 绥滨县| 望奎县| 铜梁县| 三江| 平潭县| 宾川县| 新民市| 疏附县| 旬邑县| 威宁| 志丹县| 墨玉县| 驻马店市| 璧山县| 桐柏县| 井冈山市| 松阳县| 宜宾县| 满城县| 东山县| 金华市| 乐至县| 盐池县| 万州区|