代码随想录算法训练营day13

1.二叉树的递归遍历和迭代遍历

1.1 题目

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

1.2 题解一(递归遍历)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void preTraversal(TreeNode* root, vector<int>& vec)
    {
        if (root == nullptr)return;
        //中
        vec.push_back(root->val);
        //左
        preTraversal(root->left,vec);
        //右
        preTraversal(root->right,vec);
    }
    vector<int> preorderTraversal(TreeNode* root) 
    {
        vector<int> vec;
        preTraversal(root,vec);
        return vec;

    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void preTraversal(TreeNode* root, vector<int>& vec)
    {
        if (root == nullptr)return;
        
        //左
        preTraversal(root->left,vec);
        //右
        preTraversal(root->right,vec);
        //中
        vec.push_back(root->val);
    }
    vector<int> postorderTraversal(TreeNode* root) 
    {
        vector<int> vec;
        preTraversal(root,vec);
        return vec;

    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void preTraversal(TreeNode* root, vector<int>& vec)
    {
        if (root == nullptr)return;
        
        //左
        preTraversal(root->left,vec);
        //中
        vec.push_back(root->val);
        //右
        preTraversal(root->right,vec);
        
    }
    vector<int> inorderTraversal(TreeNode* root) 
    {
        vector<int> vec;
        preTraversal(root,vec);
        return vec;

    }
};

1.3 题解二(迭代遍历)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

	vector<int> preorderTraversal(TreeNode* root)
	{
		vector<int> vec;
		stack<TreeNode*> sta;
		if (root == nullptr)return vec;
		sta.push(root);
		while (!sta.empty())
		{
			//中
			TreeNode* tmp = sta.top();
			sta.pop();
			vec.push_back(tmp->val);

			//空节点不入栈
			//先放右节点,因为从栈弹出来是先进后出
			if (tmp->right) sta.push(tmp->right);
			//再放左节点
			if (tmp->left)sta.push(tmp->left);

		}
        return vec;
	}
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution 
{
public:
    vector<int> postorderTraversal(TreeNode* root)
    {
        vector<int> result;
        stack<TreeNode*> st;

        if (root == nullptr)return result;
        st.push(root);
        while (!st.empty())
        {
            //中
            TreeNode* rootValue = st.top();
            st.pop();
            result.push_back(rootValue->val);
            
            //左
            if (rootValue->left != nullptr)st.push(rootValue->left);

            //右
            if (rootValue->right != nullptr)st.push(rootValue->right);
            
        }
        reverse(result.begin(), result.end());
        return result;
    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
 class Solution 
 {
 public:
     vector<int> inorderTraversal(TreeNode* root)
     {
         vector<int> result;
         //每次遍历的节点都要入栈
         stack<TreeNode*> st;
         TreeNode* cur = root;
         while (cur!=nullptr||!st.empty())
         {
             if (cur != nullptr)
             {
                 st.push(cur);
                 cur = cur->left;
             }
             else
             {
                 cur = st.top();
                 st.pop();
                 result.push_back(cur->val);
                 cur = cur->right;
             }

         }
         return result;
     }
 };

2.二叉树的层序遍历

2.1 题目

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

. - 力扣(LeetCode)

2.1 题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
 class Solution {
 public:
     vector<vector<int>> levelOrder(TreeNode* root) 
     {
         vector<vector<int>> result;
         queue<TreeNode*> q;
         if (root!=nullptr)q.push(root);
         while (!q.empty())
         {
             vector<int> vec;
             int size = q.size();
             while (size--)
             {
                 TreeNode* tmp = q.front();
                 q.pop();
                 vec.push_back(tmp->val);
                 if (tmp->left)q.push(tmp->left);
                 if (tmp->right)q.push(tmp->right);
             }
             result.push_back(vec);
             
         }
         return result;
     }
 };
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution
{
public:
	vector<vector<int>> levelOrderBottom(TreeNode* root)
	{
		vector<vector<int>> result;
		queue<TreeNode*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			vector<int> vec;
			int size = q.size();
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				vec.push_back(tmp->val);
				if (tmp->left != nullptr)q.push(tmp->left);
				if (tmp->right != nullptr)q.push(tmp->right);
			}
			result.push_back(vec);
		}
		reverse(result.begin(), result.end());
		return result;
	}
};
class Solution 
{
public:
	vector<int> rightSideView(TreeNode* root) 
	{
		vector<int> result;
		queue<TreeNode*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			int size = q.size();
			for (int i = 0; i < size; i++)
			{
				auto tmp = q.front();
				q.pop();
				if (i == (size - 1))result.push_back(tmp->val);
				if (tmp->left != nullptr)q.push(tmp->left);
				if (tmp->right != nullptr)q.push(tmp->right);
			}
		}
		return result;
	}
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution 
{
public:
	vector<double> averageOfLevels(TreeNode* root) 
	{
		vector <double> result;
		queue<TreeNode*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			long sum = 0;
			int size = q.size();
			int n = size;
			
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				sum += (tmp->val);
				if (tmp->left != nullptr)q.push(tmp->left);
				if (tmp->right != nullptr)q.push(tmp->right);
			}
			result.push_back(sum*1.0 / n);
		}
		return result;
	}
};
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution 
{
public:
	vector<vector<int>> levelOrder(Node* root) 
	{
		vector<vector<int>> result;
		queue<Node*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			int size = q.size();
			vector<int> vec;
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				vec.push_back(tmp->val);
				for (auto i : tmp->children)
				{
					if (i != nullptr)
					{
						q.push(i);
					}
				}
			}
			result.push_back(vec);
			
		}
		return result;
	}
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution 
{
public:
	vector<int> largestValues(TreeNode* root) 
	{
		vector<int> result;
		queue<TreeNode*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			int size = q.size();
			int min_num = INT32_MIN;
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				min_num = tmp->val > min_num ? tmp->val : min_num;
				if (tmp->left != nullptr)q.push(tmp->left);
				if (tmp->right != nullptr)q.push(tmp->right);
			}
			result.push_back(min_num);
		}
		return result;
	}
};
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
	Node* connect(Node* root) 
	{
		
		queue <Node*> q;
		if (root != nullptr)q.push(root);
		Node* pre;
		while (!q.empty())
		{
			int size = q.size();
			//表示前一个节点
			Node* headNodePerlevel;
			//表示当前节点
			Node* node;
			for (int i = 0; i < size; i++)
			{
				//每一层的第一个节点
				if (i == 0)
				{
					headNodePerlevel = q.front();
					q.pop();
					node = headNodePerlevel;
				}
				//当前层的别的节点
				else
				{
					node = q.front();
					q.pop();
					headNodePerlevel->next = node;
					headNodePerlevel = node;
				}
				if (node->left != nullptr)q.push(node->left);
				if (node->right != nullptr)q.push(node->right);
			}
			//遍历完这一层,最后的节点指向Null
			node->next = nullptr;

		}
		return root;
	}
};
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
	Node* connect(Node* root) 
	{
		queue<Node*> q;
		if (root != nullptr)q.push(root);
		while (!q.empty())
		{
			int size = q.size();
			Node* preNode;
			Node* nownode;
			for (int i = 0; i < size; i++)
			{
				if (i == 0) 
				{
					preNode = q.front();
					q.pop();
					nownode = preNode;
				}
				else
				{
					nownode = q.front();
					q.pop();
					preNode->next = nownode;
					preNode = nownode;
				}
				if (nownode->left != nullptr)q.push(nownode->left);
				if (nownode->right != nullptr)q.push(nownode->right);
			}
			nownode->next = nullptr;
		}
		return root;
	}
};
class Solution {
public:
	int maxDepth(TreeNode* root) 
	{
		if (root == nullptr)return 0;
		queue<TreeNode*> q;
		q.push(root);
		int count = 0;
		while (!q.empty())
		{
			int size = q.size();
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				if (tmp->left!= nullptr)q.push(tmp->left);
				if (tmp->right!= nullptr)q.push(tmp->right);
			}
			count++;
		}
		return count;
	}
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
	int minDepth(TreeNode* root) 
	{
		if (root == nullptr)return 0;
		queue<TreeNode*> q;
		q.push(root);
		int count = 0;
		while (!q.empty())
		{
			int size = q.size();
			count++;
			while (size--)
			{
				auto tmp = q.front();
				q.pop();
				if (tmp->left != nullptr)
				{
					q.push(tmp->left);
				}
				if (tmp->right != nullptr)
				{
					q.push(tmp->right);
				}
				if (!tmp->left && !tmp->right)
				{
					return count;
				}
			}

		}
		return count;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值