美文网首页
【剑指Offer学习】【面试题18 :树的子结构】

【剑指Offer学习】【面试题18 :树的子结构】

作者: 林大鹏 | 来源:发表于2018-01-30 17:00 被阅读15次

题目:

输入两棵二叉树A 和B,判断B 是不是A 的子结构。

思路:

要查找树A 中是否存在和树B 结构一样的子树,我们可以分成两步: 第一步在树A 中找到和B 的根结点的值一样的结点R, 第二步再判断树A 中以R 为根结点的子树是不是包含和树B 一样的结构。

代码:

树节点:

#import <Foundation/Foundation.h>
// 树节点
@interface NSBinaryTreeNode : NSObject
// 值
@property (nonatomic, strong) NSString *value;
// 左节点
@property (nonatomic, strong) NSBinaryTreeNode *left;
// 右节点
@property (nonatomic, strong) NSBinaryTreeNode *right;
@end

#import "NSBinaryTreeNode.h"
#import <Foundation/Foundation.h>


/**
 判断 子树 是不是 根树的子结构。

 @param rootTreeHeaderNode 根树
 @param subTreeHeaderNode 子树
 @return 返回 是否 一直
 */
BOOL matchBinaryTree (NSBinaryTreeNode *rootTreeHeaderNode, NSBinaryTreeNode *subTreeHeaderNode) {
    if ([rootTreeHeaderNode isEqual:subTreeHeaderNode]) {
        return NO;
    }
    
    // 当 子树节点为空, 返回一致
    if (subTreeHeaderNode == nil) {
        return YES;
    }
    
     // 子树的根结点不为空,如果根树的根结点为空就返回false
    if (rootTreeHeaderNode == nil) {
        return NO;
    }
    
     // 如果两个结点的值相等,则分别判断其左子结点和右子结点
     if ([rootTreeHeaderNode.value isEqualToString:subTreeHeaderNode.value]) {
          return matchBinaryTree(rootTreeHeaderNode.left, subTreeHeaderNode.left) && matchBinaryTree(rootTreeHeaderNode.right, subTreeHeaderNode.right);
     }
 
    return NO;
}


/**
 根数rootTreeHeaderNode 是否 包含 子树 subTreeHeaderNode

 @param rootTreeHeaderNode 根数
 @param subTreeHeaderNode 子树
 @return 是否包含
 */
BOOL containerSubBinaryTree (NSBinaryTreeNode *rootTreeHeaderNode, NSBinaryTreeNode *subTreeHeaderNode) {
    
    if (rootTreeHeaderNode == nil) {
        return NO;
    }
    
    if (subTreeHeaderNode == nil) {
        return NO;
    }
    
    if ([rootTreeHeaderNode.value isEqualToString:subTreeHeaderNode.value]) {
        BOOL isContainer = matchBinaryTree(rootTreeHeaderNode, subTreeHeaderNode);
        if (isContainer) {
            return YES;
        }
    }

    return containerSubBinaryTree(rootTreeHeaderNode.left, subTreeHeaderNode) || containerSubBinaryTree(rootTreeHeaderNode.right, subTreeHeaderNode);
}


int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSBinaryTreeNode *root = [NSBinaryTreeNode new];
        root.value = @"8";
        root.left = [NSBinaryTreeNode new];
        root.left.value = @"6";
        root.left.left = [NSBinaryTreeNode new];
        root.left.left.value = @"5";
        root.left.right = [NSBinaryTreeNode new];
        root.left.right.value = @"7";
        root.right = [NSBinaryTreeNode new];
        root.right.value = @"10";
        root.right.left = [NSBinaryTreeNode new];
        root.right.left.value = @"9";
        root.right.right = [NSBinaryTreeNode new];
        root.right.right.value = @"11";
        
        NSBinaryTreeNode *subRoot = [NSBinaryTreeNode new];
        subRoot.value = @"8";
        subRoot.left = [NSBinaryTreeNode new];
        subRoot.left.value = @"6";
        subRoot.right = nil;
        subRoot.left.left = [NSBinaryTreeNode new];
        subRoot.left.left.value = @"5";
        subRoot.right.right = nil;
        
        BOOL isContainer = containerSubBinaryTree(root, subRoot);
        
        NSLog(@"---: %d", isContainer);
    }
    return 0;
}

相关文章

网友评论

      本文标题:【剑指Offer学习】【面试题18 :树的子结构】

      本文链接:https://www.haomeiwen.com/subject/wmexzxtx.html