tree:判断对称树

Leetcode, SymmetricTree

#include 
#include 
#include 
using namespace std;

struct TreeNode
{
     
	int _val;
	TreeNode *_left;
	TreeNode *_right;
	TreeNode(int x) : _val(x), _left(nullptr), _right(nullptr) {
      }
};

bool isSymmetric(TreeNode *left, TreeNode *right)
{
     
	if (!left && !right)	return true;	//终止条件
	if (!left || !right)	return false;	//剪枝
	return left->_val == right->_val
		&& isSymmetric(left->_left, right->_right)
		&& isSymmetric(left->_right, right->_left);
}

// 递归版,时间复杂度 O(n),空间复杂度 O(logn)
bool solution(TreeNode *root)
{
     
	return root ? isSymmetric(root->_left, root->_right) : true;
}

// 迭代版,时间复杂度 O(n),空间复杂度 O(logn)
bool solution2(TreeNode *root)
{
     
	if (!root)	return true;
	stack<TreeNode *> stk;
	stk.push(root->_left);
	stk.push(root->_right);

	while (!stk.empty())
	{
     
		auto p = stk.top();
		stk.pop();
		auto 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->_right);
		stk.push(p->_right);
		stk.push(q->_left);
	}
	return true;
}


int main()
{
     
	{
     
		TreeNode *p1 = new TreeNode(1);
		TreeNode *p2 = new TreeNode(2);
		TreeNode *p3 = new TreeNode(2);
		TreeNode *p4 = new TreeNode(3);
		TreeNode *p5 = new TreeNode(4);
		TreeNode *p6 = new TreeNode(4);
		TreeNode *p7 = new TreeNode(3);
		p1->_left = p2;
		p1->_right = p3;
		p2->_left = p4;
		p2->_right = p5;
		p3->_left = p6;
		p3->_right = p7;

		//cout << solution(p1) << endl;	//1
		cout << solution2(p1) << endl;	//1
	}

	{
     
		TreeNode *q1 = new TreeNode(1);
		TreeNode *q2 = new TreeNode(2);
		TreeNode *q3 = new TreeNode(2);
		TreeNode *q4 = new TreeNode(3);
		TreeNode *q5 = new TreeNode(3);
		q1->_left = q2;
		q1->_right = q3;
		q2->_right = q4;
		q3->_right = q5;
		
		//cout << solution(q1) << endl;	//0
		cout << solution2(q1) << endl;	//0
	}

	return 0;
}

你可能感兴趣的:(leet)