题记:写这篇博客要主是加深自己对遍历二叉树的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。
言前
我们晓得遍历一颗二叉树一般有三种式方:先序、中序、后序。而且每一颗二叉树的三种遍历
式方的结果各自都是独一的。但是有可能一颗二叉树的先序遍历结果和另一个不同的二叉树的中
序遍历结果是雷同的。我们够能有二叉树求得其三种遍历结果,那么我们有可能根据三种遍历结果
去肯定一颗二叉树么?
二叉树的肯定
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; } }
输出结果: