zoukankan      html  css  js  c++  java
  • 剑指offer-面试题26-树的子结构-二叉树

    /*
    题目:
    	输入两棵二叉树A和B,判断B是不是A的子树。
    */
    /*
    思路:
    	1、注意浮点数大小的判断。
    	2、判断树A的某个节点是否和树B的根节点是否相同,
    		若相同,则判断以A该节点为根节点是否包含树B;
    		若不包含,判断A的左子树是否包含树B;
    		若不包含,判断A的右子树是否包含树B。
    	3、以A的某个节点为根,判断是否对应B的根节点,
    		判断A的左子树和B的左子树的相等性;判断A的右子树和B的右子树的相等性。	
    */
    #include <iostream>
    #include<cstdlib>
    
    using namespace std;
    
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    			val(x), left(NULL), right(NULL) {
    	}
    };
    
    bool equals(double num1, double num2){
        if(num1-num2 > -0.0000001 && num1-num2 < 0.0000001){
            return true;
        }
        return false;
    }
    
    bool doesHasSubtree(TreeNode* pNode1,TreeNode* pNode2){
        if(pNode2 == nullptr) return true;
        if(pNode1 == nullptr) return false;
        if(equals(pNode1->val,pNode2->val)){
            return doesHasSubtree(pNode1->left,pNode2->left) && doesHasSubtree(pNode1->right,pNode2->right);
        }
        return false;
    }
    
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result = false;
        if(pRoot1 != nullptr && pRoot2 != nullptr){
            if(equals(pRoot1->val,pRoot2->val)){
                result = doesHasSubtree(pRoot1,pRoot2);
            }
            if(!result){
                result = HasSubtree(pRoot1->left,pRoot2);
            }
            if(!result){
                result = HasSubtree(pRoot1->right,pRoot2);
            }
    
        }
        return result;
    }
    
    int main()
    {
        TreeNode *node7 = new TreeNode(7);
        TreeNode *node6 = new TreeNode(4);
        TreeNode *node5 = new TreeNode(3);
        TreeNode *node4 = new TreeNode(9);
        TreeNode *node3 = new TreeNode(7);
        TreeNode *node2 = new TreeNode(8);
        TreeNode *node1 = new TreeNode(8);
    
        node1->left = node2;
        node1->right = node3;
        node2->left = node4;
        node2->right = node5;
        node5->left = node6;
        node5->right =node7;
    
        TreeNode *node31 = new TreeNode(2);
        TreeNode *node21 = new TreeNode(9);
        TreeNode *node11 = new TreeNode(8);
    
        node11->left = node21;
        node11->right = node31;
    
        cout<<HasSubtree(node1,node11)<<endl;
        
        return 0;
    }
    

       

  • 相关阅读:
    java
    图解MotionEvent中getRawX、getRawY与getX、getY以及View中的getScrollX、getScrollY
    ListView分栏--制作分栏音乐列表
    Android中Touch事件的传递机制
    Android进程间通信之使用AIDL
    Android进程间通信之使用Messenger
    Android Mms之短信接收流程--从Framework到App
    Android组件的使用:ListView、GridView
    Android组件的使用:AutoCompleteTextView、Spinner
    Android组件的使用:DatePicker,TimePicker
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11918956.html
Copyright © 2011-2022 走看看