LeetCode题解——T94(二叉树的中序遍历)

题目描述

给定一个二叉树,返回它的中序 遍历。
示例:
在这里插入图片描述
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

题解思路

//伪代码
//创建一个树的结构体,包含节点值val,左子树右子树,并进行初始化
栈S
p=root;
向量v记录返回的序列;
while(p存在||S非空){
	while(p存在){
		p入栈S;
		p = p的左子树;//当p不是null的时候,就从根节点一直遍历左子树,并将这些节点一次入栈,直到p为空
}
	//当p为null后,说明已经遍历到了最底层的左子树节点,则将栈顶弹出,并将该节点的值存入v中
		弹出栈顶;
		将p的值存进v;
		p = p的右子树:
}
		返回v;
/**
//  * Definition for a binary tree node.
//  * struct TreeNode {
//  *     int val;
//  *     TreeNode *left;
//  *     TreeNode *right;
//  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
//  * };
//  */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        TreeNode *p = root;
        stack<TreeNode *> S;
        vector<int> v;
        while(p||!S.empty()){
            while(p){
                S.push(p);
                p = p->left;
            }
            p = S.top();
            S.pop();
            v.push_back(p->val);
            p = p->right;
        }
        return v;
    }
};

附上调试代码:

#include<iostream>
#include<vector>
#include<stdio.h>
#include<stack>
using namespace std;

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

TreeNode *construct(string &data, int &i)
{
	if (i >= data.size() || data[i] == 'n')
	{
		i += 2;
		return nullptr;
	}
	string t;
	while (i < data.size() && data[i] != ',') t += data[i++];
	++i;
	TreeNode *n = new TreeNode(atoi(t.c_str()));
	n->left = construct(data, i);
	n->right = construct(data, i);
	return n;
}

TreeNode* deserialize(string data)
{
	int i = 0;
	return construct(data, i);
}
class Solution {
public:
	vector<int> inorderTraversal(TreeNode* root) {
		stack<TreeNode*> S;
		vector<int> v;
		TreeNode* rt = root;
		while (rt || S.size()) {
			while (rt) {
				S.push(rt);
				rt = rt->left;
			}
			rt = S.top(); S.pop();
			v.push_back(rt->val);
			rt = rt->right;
		}
		for (int i = 0; i < v.size(); i++)
			cout << v[i] << " ";

		cout << endl;
		return v;
		
	}
};


int main()
{
	Solution s;
	string tree = "1,2,4,8,n,n,9,n,n,5,10,n,n,11,n,n,3,6,12,n,n,13,n,n,7,14,n,n,15,n,n";
	TreeNode *root = deserialize(tree);
	s.inorderTraversal(root);
	return 0;
}

代码执行结果

在这里插入图片描述

学习内容

1.vector基本函数实现:void push_back(const T& x):向量尾部增加一个元素X

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值