题解 | 树的子结构

树的子结构

https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
#include <stack>
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
		if(!pRoot1 || !pRoot2)return false;

		stack<TreeNode*> stk;
		stk.push(pRoot1);

		while(!stk.empty()){
			TreeNode* node = stk.top();stk.pop();
			if(node->val == pRoot2->val && cheakif(node, pRoot2)){
				return true;
			}
			if(node->right)stk.push(node->right);
			if(node->left)stk.push(node->left);
		}

		return false;
    }

	bool cheakif(TreeNode* r1, TreeNode* r2){
		stack<TreeNode*> stk1;  //本例采用前序遍历的方法,根-左-右
		stack<TreeNode*> stk2;

		stk1.push(r1);
		stk2.push(r2);
		while(!stk2.empty()){  //第二个子树是模板,只用比较模板中存在的节点即可
			if( !stk1.top() || stk1.top()->val != stk2.top()->val) return false;

			TreeNode* node1 = stk1.top();stk1.pop();  
			TreeNode* node2 = stk2.top();stk2.pop();
			if(node2->right){           //只用比较模板有的,考虑结构(位置)是否相同:节点始终保持同步,位置相同;
				stk2.push(node2->right);
				stk1.push(node1->right);
			}
			if(node2->left){
				stk2.push(node2->left);		
				stk1.push(node1->left);
			}
		}

		return true;
	}
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务