先序、中序确定二叉树
?????? 前言
?????????????? 我們知道遍歷一顆二叉樹一般有三種方式:先序、中序、后序。而且每一顆二叉樹的三種遍歷
????????? 方式的結果各自都是唯一的。但是有可能一顆二叉樹的先序遍歷結果和另一個不同的二叉樹的中
????????? 序遍歷結果是相同的。我們能夠有二叉樹求得其三種遍歷結果,那么我們有可能根據三種遍歷結果
????????? 去確定一顆二叉樹么?
????? 二叉樹的確定
?????????????? 1、三種單獨的遍歷方式無法確定二叉樹。
???????? 略微思考一下就可以明白,先序遍歷只能確定其根節點,對于之后的情況是完全無法確定的,同樣
???????? 的對于中序,后序遍歷就也會存在這種情況.。證明不好說,我們直接用一個反例來說明。
??????????????? 假設先序遍歷的結果為ABCD。可以看出的是對于其結果會存在不同的二叉樹的先序遍歷都為
???????? ABCD。因此只是先序遍歷是無法確定一棵二叉樹的。
???? ? ? ? ? ? ? ? ?????????
??????????????????? 至于后序和中序的情況就不在反證了。
?????????????? 既然單個的遍歷情形無法確定二叉樹那么我們來通過組合看能否確定一棵二叉樹。
??????????????????? 2、已知先序和中序可以確定一棵二叉樹。
???????????????????????? ● 如果先序和中序遍歷都是空的,這確定一棵空二叉樹。
???????????????????????? ● 對于有n(n>=2)個結點的情況先序遍歷中的第一個結點必然是二叉樹的根結點,然后在
?????????????? 中序遍歷中找到根結點,這樣就唯一確定了根結點了。在中序遍歷序列中根結點前面的序列就是
?????????????? 根結點的左子樹的中序遍歷序列。同理在先序遍歷中根結點之后到中序遍歷中的根節點的那部分
?????????????? 序列就是根節點的做子樹的先序遍歷。這樣遞歸下去就可以確定唯一確定左子樹。根節點的右子
?????????????? 樹的分析同理。
?????????????????? 3、中序遍歷和后序遍歷可以唯一確定一顆二叉樹。
????????????????????????? 具體的分析參見2.
?????????????????? 4、先序遍歷和后序遍歷無法確定一顆二叉樹。
????????????????????????? 略微思考一下就明白了,此種情況只能確定根節點,但是根節點的左子樹,右子樹序列根
??????????????? 本無法確定。
????????? 先序、中序確定二叉樹實現
????????????????? 進過上述分析,我們知道了二叉樹的確定可以通過兩種情況來確定,也就是先序和中序組合,后序
????????????? 中序組合。這里我們對前者的組合方式做一個實現,下面是代碼部分。?
package com.kiritor; public class TestBinaryTree { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); bt.root = BinaryTree.createBT("ABDCEGFHI", "DBAEGCHFI"); System.out.println("PreOrder:");// 先序輸出 bt.preOrder(bt.root); System.out.println("\n"); System.out.println(" Inorder:");// 中序輸出 bt.inOrder(bt.root); System.out.println("\n"); System.out.println(" PostOrder:");// 后序輸出 bt.postOrder(bt.root); } } class BinaryTree { protected BinaryTreeNode root; public BinaryTree() { root = null; } public BinaryTree(char element) { root = new BinaryTreeNode(element); } public BinaryTree(char element, BinaryTree leftTree, BinaryTree rightTree) { root = new BinaryTreeNode(element); if (leftTree != null) { root.left = leftTree.root; } if (rightTree != null) { root.right = rightTree.root; } } public void preOrder(BinaryTreeNode node) { if (node != null) { System.out.print(node.element); preOrder(node.left); preOrder(node.right); } } public void inOrder(BinaryTreeNode node) { if (node != null) { inOrder(node.left); System.out.print(node.element); inOrder(node.right); } } public void postOrder(BinaryTreeNode node) { if (node != null) { postOrder(node.left); postOrder(node.right); System.out.print(node.element); } } // 利用先序表達式和中序表達式構建一棵字符二叉樹 public static BinaryTreeNode createBT(String pres, String ins) { int inpos = 0; BinaryTreeNode root; String leftPres, leftIns, rightPres, rightIns; if (pres.length() == 0 || ins.length() == 0) { return null; } else { root = new BinaryTreeNode(pres.charAt(0));//首先就可以確定根結點了 //之后確定中序遍歷中的根結點的位置 while (((Character) ins.charAt(inpos)) != root.element) inpos++; //遞歸確定左結點 leftPres = pres.substring(1, inpos + 1); leftIns = ins.substring(0, inpos); root.left = createBT(leftPres, leftIns); //遞歸生成右結點 rightPres = pres.substring(inpos + 1, pres.length()); rightIns = ins.substring(inpos + 1, ins.length()); root.right = createBT(rightPres, rightIns); } return root; } } class BinaryTreeNode { protected char element; protected BinaryTreeNode left, right; BinaryTreeNode(char obj) { element = obj; left = null; right = null; } }?????????? 輸出結果:?????????????????????????
???????
轉載于:https://blog.51cto.com/kiritor/1226677
總結
以上是生活随笔為你收集整理的先序、中序确定二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 第一个OpenGL ES
- 下一篇: 梦见被空袭了