tree:判断相同树

Leetcode, SameTree

#include 
#include 
#include 
using namespace std;

struct TreeNode
{
     
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
      }
};

// 递归版,时间复杂度 O(n),空间复杂度 O(logn)
bool solution(TreeNode *p, TreeNode *q)
{
     
	if (!p && !q)	return true;	//终止条件
	if (!p || !q)	return false;	//剪枝
	return p->val == q->val
		&& solution(p->left, q->left)
		&& solution(p->right, q->right);
}

// 迭代版,时间复杂度 O(n),空间复杂度 O(logn)
bool solution2(TreeNode *p, TreeNode *q)
{
     
	stack<TreeNode *> stk;
	stk.push(p);
	stk.push(q);

	while (!stk.empty())
	{
     
		p = stk.top();
		stk.pop();
		q = stk.top();
		stk.pop();

		if (!p && !q)	continue;
		if (!p || !q)	return false;
		if (p->val != q->val)	return false;

		stk.push(p->left);
		stk.push(q->left);
		stk.push(p->right);
		stk.push(q->right);
	}
	return true;
}


int main()
{
     
	{
     
		TreeNode *p1 = new TreeNode(1);
		TreeNode *p2 = new TreeNode(2);
		TreeNode *p3 = new TreeNode(3);
		p1->left = p2;
		p1->right = p3;
		TreeNode *q1 = new TreeNode(1);
		TreeNode *q2 = new TreeNode(2);
		TreeNode *q3 = new TreeNode(3);
		q1->left = q2;
		q1->right = q3;
		//cout << solution(p1, q1) << endl;	//1
		cout << solution2(p1, q1) << endl;	//1
	}

	{
     
		TreeNode *p1 = new TreeNode(1);
		TreeNode *p2 = new TreeNode(2);
		p1->left = p2;
		TreeNode *q1 = new TreeNode(1);
		TreeNode *q2 = new TreeNode(2);
		q1->right = q2;
		//cout << solution(p1, q1) << endl;	//0
		cout << solution2(p1, q1) << endl;	//0
	}

	{
     
		TreeNode *p1 = new TreeNode(1);
		TreeNode *p2 = new TreeNode(2);
		TreeNode *p3 = new TreeNode(1);
		p1->left = p2;
		p1->right = p3;
		TreeNode *q1 = new TreeNode(1);
		TreeNode *q2 = new TreeNode(2);
		TreeNode *q3 = new TreeNode(1);
		q1->left = q3;
		q1->right = q2;
		//cout << solution(p1, q1) << endl;	//0
		cout << solution2(p1, q1) << endl;	//0
	}


	return 0;
}

你可能感兴趣的:(leet)