已知二叉樹的前序中序遍歷,求該二叉樹的后續遍歷-附Java代碼實現


對一棵二叉樹進行遍歷,我們可以采取3中順序進行遍歷,分別是前序遍歷、中序遍歷和后序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那么對應的訪問遍歷順序如下:

 

  • 前序遍歷    N->L->R
  • 中序遍歷    L->N->R
  • 后序遍歷    L->R->N
所以,對於以下這棵樹,三種遍歷方式的結果是:
 
  • 前序遍歷    ABCDEF
  • 中序遍歷    CBDAEF
  • 后序遍歷    CDBFEA

 

現在我們知道前序ABCDEF和中序遍歷 CBDAEF,欲求后序遍歷的。思路如下。

第一步,由前序遍歷第一個值為A,中序遍歷A的左邊為CBD,右邊為EF得知二叉樹的基本結構為: A為根節點,A的左邊有CBD,右邊有EF

 

第二部,對A的左邊進行處理,A的左邊三個字母的前序遍歷為BCD,中序遍歷為CBD,按照第一步可得,B為BCD三個字母的跟節點,B的左邊為C,右邊為D。

 

第三部,對A的右邊進行處理,原理和左邊處理類似。

 

總結來說就是使用遞歸處理。下面是Java實現的代碼

 

package mianshiti;

/**
 * Test2
 * create by chenshihang on 2018/8/21
 */
public class Test2 {

    //根據前序遍歷fstr,和中序遍歷mstr得到二叉樹根節點
    public static TreeNode method1(String fStr,String mStr){
        TreeNode treeNode = new TreeNode(fStr.charAt(0),null,null);

        if(fStr.length()==1){
            return treeNode;
        }
        String[] strings = method2(fStr, mStr);
        if(strings[2] != null && strings[2].length() != 0){
            treeNode.lNode = method1(strings[0],strings[2]);
        }
        if(strings[3]!=null && strings[3].length() != 0){
            treeNode.rNode = method1(strings[1],strings[3]);
        }
        return treeNode;
    }

    //根據前序fstr,中序mstr得出該節點的左子樹前序stirng[0],中序string[2],右子樹前序string[1],中序string[3]
    public static String[] method2(String fStr,String mStr){

        String[] result = new String[4];
        if(fStr.length()==1){
            return result;
        }
        String[] middleSplit = new String[2];
        mStr.split(fStr.charAt(0)+"");
        middleSplit[0]=mStr.split(fStr.charAt(0)+"")[0];
        if (mStr.split(fStr.charAt(0)+"").length==1){
            middleSplit[1]="";
        }else {
            middleSplit[1] = mStr.split(fStr.charAt(0)+"")[1];
        }
        int middleLeftCount = middleSplit[0].length();
        String[] frontSplit = new String[2];
        frontSplit[0] = fStr.substring(1,middleLeftCount+1);
        frontSplit[1] = fStr.substring(middleLeftCount+1);
        result[0] = frontSplit[0];
        result[1] = frontSplit[1];
        result[2] = middleSplit[0];
        result[3] = middleSplit[1];
        return result;
    }

    //傳入二叉樹的根節點,后序遍歷輸出節點的值
    public static void method3(TreeNode rootNode){
        if(rootNode.lNode!=null){
            method3(rootNode.lNode);
        }
        if(rootNode.rNode!= null){
            method3(rootNode.rNode);
        }
        System.out.println(rootNode.value);

    }
    public static void main(String[] args) {
        TreeNode rootNode = method1("ABCDEF","CBDAEF");
        method3(rootNode);
    }
}

class TreeNode{
    public char value;
    public TreeNode lNode;
    public TreeNode rNode;

    public TreeNode(char value, TreeNode lNode, TreeNode rNode) {
        this.value = value;
        this.lNode = lNode;
        this.rNode = rNode;
    }
}

 

運行結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM