226翻轉二叉樹(遞歸、迭代)

1、題目描述

翻轉一棵二叉樹。

2、示例

輸入:

     4
   /   \
  2     7
 / \     / \
1   3 6   9
輸出:

     4
   /   \
  7     2
 / \     / \
9   6 3   1

3、題解

解法一:

基本思想:遞歸

解法二:

基本思想:迭代

#include<iostream>
#include<vector>
#include<algorithm>
#include<deque>
using namespace std;
struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
#define inf 9999
void Init_TreeNode(TreeNode** T, vector<int>& vec, int& pos)
{
	if (vec[pos] == inf || vec.size() == 0)
		*T = NULL;
	else
	{
		(*T) = new TreeNode(0);
		(*T)->val = vec[pos];
		Init_TreeNode(&(*T)->left, vec, ++pos);
		Init_TreeNode(&(*T)->right, vec, ++pos);
	}
}
void PreOrderTraverse(TreeNode* T)
{
	if (T == NULL)
		return;
	cout << T->val << " ";
	PreOrderTraverse(T->left);
	PreOrderTraverse(T->right);
}
class Solution {
public:
	TreeNode* invertTree(TreeNode* root) {
		//基本思想:遞歸
		Recursion(root);
		return root;
	}
	void Recursion(TreeNode* root)
	{
		if (root == nullptr)
			return;
		TreeNode* temp = root->left;
		root->left = root->right;
		root->right = temp;
		Recursion(root->left);
		Recursion(root->right);
	}
};
class Solution1 {
public:
	TreeNode* invertTree(TreeNode* root) {
		//基本思想:迭代
		if (root == nullptr)
			return nullptr;
		deque<TreeNode*> queue;
		queue.push_front(root);
		while (!queue.empty())
		{
			TreeNode* cur = queue.back();
			queue.pop_back();
			TreeNode* temp = cur->left;
			cur->left = cur->right;
			cur->right = temp;
			if (cur->left != nullptr)
				queue.push_front(cur->left);
			if (cur->right != nullptr)
				queue.push_front(cur->right);
		}
		return root;
	}
};
int main()
{
	Solution1 solute;
	TreeNode* root = NULL;
	vector<int> vec = { 1,2,4,inf,inf,5,inf,inf,3,6,inf,inf,inf };
	int pos = 0;
	Init_TreeNode(&root, vec, pos);
	root = solute.invertTree(root);
	PreOrderTraverse(root);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章