二叉树三种遍历方式:包括递归和非递归

news/2024/7/20 22:44:51 标签: 算法, 深度优先

前序遍历递归:

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

class Solution {
public:
	vector<int> PreOrder(TreeNode* root) {
		vector<int> res;
		Order(root, res);
		return res;
	}
	void Order(TreeNode* root,vector<int>& res) {
		if (root == NULL)return;
		res.push_back(root->val);
		Order(root->left, res);
		Order(root->right, res);
	}
};

int main() {
	TreeNode* A = new TreeNode(1);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(3);
	A->right = B;
	B->left = C;
	Solution ss;
	vector<int> result = ss.PreOrder(A);
	for (auto& ch: result) {
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

前序遍历非递归:

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

class Solution {
public:
	vector<int> PreOrder(TreeNode* root) {
		stack<TreeNode*> st;
		vector<int> res;
		st.push(root);
		while (!st.empty()) {
			TreeNode* node = st.top();
			st.pop();
			res.push_back(node->val);
			if (node->right)st.push(node->right);
			if (node->left)st.push(node->left);
		}
		return res;
	}
};

int main() {
	TreeNode* A = new TreeNode(1);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(3);
	A->right = B;
	B->left = C;
	Solution ss;
	vector<int> result = ss.PreOrder(A);
	for (auto& ch : result) {
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

后序递归

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

class Solution {
public:
	vector<int> AfterOrder(TreeNode* root) {
		vector<int> res;
		dfs(root, res);
		return res;
	}
	void dfs(TreeNode* root,vector<int>& res) {
		if (root == NULL)return;
		dfs(root->left, res);
		dfs(root->right, res);
		res.push_back(root->val);
	}
};

int main() {
	TreeNode* A = new TreeNode(1);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(3);
	A->right = B;
	B->left = C;
	Solution ss;
	vector<int> result = ss.AfterOrder(A);
	for (auto& ch : result) {
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

后序非递归

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

class Solution {
public:
	vector<int> AfterOrder(TreeNode* root) {
		stack<TreeNode*> st;
		vector<int> res;
		st.push(root);
		while (!st.empty()) {
			TreeNode* node = st.top();
			st.pop();
			res.push_back(node->val);
			if (node->left)st.push(node->left);
			if (node->right)st.push(node->right);
		}
		reverse(res.begin(), res.end());
		return res;
	}
};

int main() {
	TreeNode* A = new TreeNode(1);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(3);
	A->right = B;
	B->left = C;
	Solution ss;
	vector<int> result = ss.AfterOrder(A);
	for (auto& ch : result) {
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

中序递归

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

class Solution {
public:
	vector<int> Order(TreeNode* root) {
		
		vector<int>res;
		dfs(root, res);
		return res;
	}
	void dfs(TreeNode* root,vector<int>& res) {
		if (root == NULL)return;
		dfs(root->left, res);
		res.push_back(root->val);
		dfs(root->right, res);
	}
};

int main() {
	TreeNode* A = new TreeNode(1);
	TreeNode* B = new TreeNode(2);
	TreeNode* C = new TreeNode(3);
	A->right = B;
	B->left = C;
	Solution ss;
	vector<int> result = ss.Order(A);
	for (auto& ch : result) {
		cout << ch << " ";
	}
	cout << endl;
	return 0;
}

http://www.niftyadmin.cn/n/474552.html

相关文章

HiveSQL之datediff、date_add、date_sub详解及注意坑点

文章目录 datediff介绍&#xff1a;示例1&#xff1a;正常情况示例2&#xff1a;负值情况注意&#xff1a;使用场景示例总结 date_add介绍&#xff1a; date_sub介绍&#xff1a; 注意&#xff1a; datediff 介绍&#xff1a; datediff语法: datediff(string enddate,string …

Android shape定义背景带阴影

<?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:shape"rectangle" ><solid android:color"#0aF3F4F4"…

Rancher集群搭建

前言 随着容器的普及和Kubernetes 的日渐成熟&#xff0c;企业内部运行多个Kubernetes 集群已变得颇为常见&#xff0c;然而部署kubernetes集群的方式也多样化&#xff0c;二进制部署、rancher、kubeadm、minikube等。然而本篇文章主要讲解的是如何使用rancher快速部署一个k8s集…

C语言——详解函数栈帧的创建和销毁

函数栈帧 前言&#xff1a;一、认识相关寄存器和汇编指令1.寄存器&#xff08;寄存器是集成在cpu上的&#xff09;2.汇编指令 二、函数栈帧创建和销毁的过程1.main函数的调用2.函数栈帧的创建3.函数栈帧的销毁 前言&#xff1a; 为了深入学习C语言&#xff0c;也为了方便理解&…

javaDoc中进行页面跳转

在写java代码时&#xff0c;我们可以写一些用于代码跳转或者网页跳转的注释&#xff0c;这样一来&#xff0c;我们在开发软件&#xff08;比如Idea&#xff09;中就可以通过ctrl鼠标直接跳转。 常用的是{link}和see&#xff0c;两种用法基本一样&#xff0c;区别见下方。 {link…

shell script—运算符

本文主要介绍shell script中的算数运算符、比较运算符、逻辑运算符、赋值运算符、位运算符和条件运算符 1.算数运算符 在shell脚本中&#xff0c;可以使用一下算术运算符&#xff1a; 运算符描述加法-减法*乘法/除法%取余数自增- -自减 示例 #!/bin/basha20 b10 c$((ab)) …

测试起航,该选大公司还是小公司?

测试新人刚入职场&#xff0c;通常对比离家远近、薪资高低&#xff0c;发展前景后&#xff0c;最纠结的是选择大公司还是小公司&#xff1f; 不管是大公司还是小公司都有他的利弊&#xff0c;都需要结合自己的实际情况来进行选择。所以&#xff0c;有时候很难抉择。 选择小公司…

详解JAVA序列化

目录 1.什么是序列化 2.JAVA中的序列化 2.1.成员变量必须可序列化 2.2.transient关键字&#xff0c;可避免被序列化 2.3.无法更新状态 2.4.serialVersionUID 3.JDK序列化算法 4.序列化在实际中的一些应用 1.什么是序列化 序列化就是将对象转换为二进制格式的过程。对象…