zoukankan      html  css  js  c++  java
  • P117、面试题18:树的子结构

    题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:
    struct BinaryTreeNode{
           int  m_nValue;
           BinaryTreeNode*    m_pLeft;
           BinaryTreeNode*    m_pRight;
    }

    代码实现:

    package com.yyq;
    
    /**
     * Created by Administrator on 2015/9/15.
     */
    public class SubstructureInTree {
        public static boolean hashSubTree(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
            boolean result = false;
            if (pRoot1 != null && pRoot2 != null) {
                if (pRoot1.getM_nValue() == pRoot2.getM_nValue()) {
                    result = doesTree1HaveTree2(pRoot1, pRoot2);
                }
                if (!result) {
                    result = hashSubTree(pRoot1.getM_pLeft(), pRoot2);
                }
                if (!result) {
                    result = hashSubTree(pRoot1.getM_pRight(), pRoot2);
                }
            }
            return result;
        }
    
        public static boolean doesTree1HaveTree2(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
            if (pRoot2 == null)
                return true;
            if (pRoot1 == null)
                return false;
            if (pRoot1.getM_nValue() != pRoot2.getM_nValue())
                return false;
            return doesTree1HaveTree2(pRoot1.getM_pLeft(), pRoot2.getM_pLeft()) && doesTree1HaveTree2(pRoot1.getM_pRight(), pRoot2.getM_pRight());
        }
    
        // ====================测试代码====================
        public static void Test(String testName, BinaryTreeNode pRoot1, BinaryTreeNode pRoot2, boolean expected) {
            if (hashSubTree(pRoot1, pRoot2) == expected)
                System.out.println(testName + " passed.");
            else
                System.out.println(testName + " fail.");
        }
    
        // 树中结点含有分叉,树B是树A的子结构
    //                  8                8
    //              /                  / 
    //             8         7         9   2
    //           /   
    //          9     2
    //               / 
    //              4   7
        public static void Test1() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(7);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(2);
            BinaryTreeNode pNodeA6 = new BinaryTreeNode(4);
            BinaryTreeNode pNodeA7 = new BinaryTreeNode(7);
    
            pNodeA1.connectTreeNodes(pNodeA2, pNodeA3);
            pNodeA2.connectTreeNodes(pNodeA4, pNodeA5);
            pNodeA5.connectTreeNodes(pNodeA6, pNodeA7);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(pNodeB2, pNodeB3);
            Test("Test1", pNodeA1, pNodeB1, true);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树中结点含有分叉,树B不是树A的子结构
    //                  8                8
    //              /                  / 
    //             8         7         9   2
    //           /   
    //          9     3
    //               / 
    //              4   7
        public static void Test2() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(7);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(3);
            BinaryTreeNode pNodeA6 = new BinaryTreeNode(4);
            BinaryTreeNode pNodeA7 = new BinaryTreeNode(7);
    
            pNodeA1.connectTreeNodes(pNodeA2, pNodeA3);
            pNodeA2.connectTreeNodes(pNodeA4, pNodeA5);
            pNodeA5.connectTreeNodes(pNodeA6, pNodeA7);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(pNodeB2, pNodeB3);
    
            Test("Test2", pNodeA1, pNodeB1, false);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树中结点只有左子结点,树B是树A的子结构
    //                8                  8
    //              /                   /
    //             8                   9
    //           /                    /
    //          9                    2
    //         /
    //        2
    //       /
    //      5
        public static void Test3() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(5);
    
            pNodeA1.connectTreeNodes(pNodeA2, null);
            pNodeA2.connectTreeNodes(pNodeA3, null);
            pNodeA3.connectTreeNodes(pNodeA4, null);
            pNodeA4.connectTreeNodes(pNodeA5, null);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(pNodeB2, null);
            pNodeB2.connectTreeNodes(pNodeB3, null);
    
            Test("Test3", pNodeA1, pNodeB1, true);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树中结点只有左子结点,树B不是树A的子结构
    //                8                  8
    //              /                   /
    //             8                   9
    //           /                    /
    //          9                    3
    //         /
    //        2
    //       /
    //      5
        public static void Test4() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(5);
    
            pNodeA1.connectTreeNodes(pNodeA2, null);
            pNodeA2.connectTreeNodes(pNodeA3, null);
            pNodeA3.connectTreeNodes(pNodeA4, null);
            pNodeA4.connectTreeNodes(pNodeA5, null);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(3);
    
            pNodeB1.connectTreeNodes(pNodeB2, null);
            pNodeB2.connectTreeNodes(pNodeB3, null);
    
            Test("Test4", pNodeA1, pNodeB1, false);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树中结点只有右子结点,树B是树A的子结构
    //       8                   8
    //                           
    //         8                   9
    //                             
    //           9                   2
    //            
    //             2
    //              
    //               5
        public static void Test5() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(5);
    
            pNodeA1.connectTreeNodes(null, pNodeA2);
            pNodeA2.connectTreeNodes(null, pNodeA3);
            pNodeA3.connectTreeNodes(null, pNodeA4);
            pNodeA4.connectTreeNodes(null, pNodeA5);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(null, pNodeB2);
            pNodeB2.connectTreeNodes(null, pNodeB3);
    
            Test("Test5", pNodeA1, pNodeB1, true);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树A中结点只有右子结点,树B不是树A的子结构
    //       8                   8
    //                           
    //         8                   9
    //                           / 
    //           9               3   2
    //            
    //             2
    //              
    //               5
        public static void Test6() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
            BinaryTreeNode pNodeA5 = new BinaryTreeNode(5);
    
            pNodeA1.connectTreeNodes(null, pNodeA2);
            pNodeA2.connectTreeNodes(null, pNodeA3);
            pNodeA3.connectTreeNodes(null, pNodeA4);
            pNodeA4.connectTreeNodes(null, pNodeA5);
    
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(3);
            BinaryTreeNode pNodeB4 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(null, pNodeB2);
            pNodeB2.connectTreeNodes(pNodeB3, pNodeB4);
    
            Test("Test6", pNodeA1, pNodeB1, false);
            pNodeA1 = null;
            pNodeB1 = null;
        }
    
        // 树A为空树
        public static void Test7() {
            BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeB3 = new BinaryTreeNode(3);
            BinaryTreeNode pNodeB4 = new BinaryTreeNode(2);
    
            pNodeB1.connectTreeNodes(null, pNodeB2);
            pNodeB2.connectTreeNodes(pNodeB3, pNodeB4);
    
            Test("Test7", null, pNodeB1, false);
            pNodeB1 = null;
        }
    
        // 树B为空树
        public static void Test8() {
            BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
            BinaryTreeNode pNodeA2 = new BinaryTreeNode(9);
            BinaryTreeNode pNodeA3 = new BinaryTreeNode(3);
            BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
    
            pNodeA1.connectTreeNodes(null, pNodeA2);
            pNodeA2.connectTreeNodes(pNodeA3, pNodeA4);
    
            Test("Test8", pNodeA1, null, false);
            pNodeA1 = null;
        }
    
        // 树A和树B都为空
        public static void Test9() {
            Test("Test9", null, null, false);
        }
    
        public static void main(String[] args) {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();
            Test8();
            Test9();
        }
    }
     
    输出结果:
    Test1 passed.
    Test2 passed.
    Test3 passed.
    Test4 passed.
    Test5 passed.
    Test6 passed.
    Test7 passed.
    Test8 passed.
    Test9 passed.
  • 相关阅读:
    注册表设置开机启动
    Sql Server 行转列、列转行
    [转]JavaScript继承详解
    创建开机启动项快捷方式
    【转】IEnumerable与IEnumerator区别
    [转]winform缩放时,控制控件的比例
    【转】反射调用性能比较
    Unity Ioc 学习笔记1
    【转】深入探析c# Socket
    【转】BOOL和bool的区别
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4933284.html
Copyright © 2011-2022 走看看