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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

先序、中序确定二叉树

發布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 先序、中序确定二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? 前言

?????????????? 我們知道遍歷一顆二叉樹一般有三種方式:先序、中序、后序。而且每一顆二叉樹的三種遍歷

????????? 方式的結果各自都是唯一的。但是有可能一顆二叉樹的先序遍歷結果和另一個不同的二叉樹的中

????????? 序遍歷結果是相同的。我們能夠有二叉樹求得其三種遍歷結果,那么我們有可能根據三種遍歷結果

????????? 去確定一顆二叉樹么?

????? 二叉樹的確定

?????????????? 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

總結

以上是生活随笔為你收集整理的先序、中序确定二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。