拓扑结构相同子树练习题

来源:互联网 发布:保罗特勤淘宝 编辑:程序博客网 时间:2024/05/17 02:10

一、题目

对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。

二、2种思路

1、比对A树根结点与B树,不对再比对左孩子与B树,不对再比对左孩子的左孩子和B树……
2、将2个二叉树遍历成字符串形式str1、str2,如果str1中包含str2,就返回true。

三、思路一:

3.1 树结构体

struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) ://初始化支持 TreeNode(int x)这种方式,即 把x赋给val,left和right赋值NULL。            val(x), left(NULL), right(NULL) {    }};

3.2 遍历树寻找与B匹配的结点

class IdenticalTree {public:    bool chkIdentical(TreeNode* A, TreeNode* B) {        if (A == NULL || B == NULL) return false;        else{            if (sameAs(A, B)){                return true;            }            else{                if (chkIdentical(A->left, B)){                    return true;                }                if (chkIdentical(A->right, B)){                    return true;                }                return false;            }        }    }    bool sameAs(TreeNode* A, TreeNode* B){        if (A == NULL&&B == NULL) return true;        else if (A != NULL&&B != NULL){            if (A->val != B->val) return false;            if (!sameAs(A->left, B->left)) return false;            if (!sameAs(A->right, B->right)) return false;            return true;        }        else return false;          }};

四、思路二

4.1 string类的重要函数

begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
empty 判断是否为空
operator[] 取第几个元素,相当于数组
c_str 取得C风格的const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator+= += 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr 得到字串
compare 比较字符串
operator+ 字符串链接
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行

4.2 树结构转化为string

叶子结点后用‘#’表示结束。

void toString(TreeNode* A, string &str){        if (A != NULL){            str.push_back('0'+A->val);            toString(A->left, str);            toString(A->right, str);        }        else{            str.push_back('#');        }    }

4.3 find函数找子串

class IdenticalTree {public:    bool chkIdentical(TreeNode* A, TreeNode* B) {        string str1, str2;        toString(A, str1);        toString(B, str2);        int pos = str1.find(str2);        if (pos <0)            return false;        else return true;    }};
0 0
原创粉丝点击