二叉树的基本操作C++

这篇博客探讨了如何使用C++进行二叉树的基本操作,特别是聚焦于计算二叉树中所有节点的数量。通过递归的方法,详细解释了如何遍历树并有效地统计节点数。
摘要由CSDN通过智能技术生成
二叉树实现
1.创建二叉树
2.递归输出二叉树
2.1递归先序输出
2.2递归中序输出
2.3递归后序输出
3.非递归输出
3.1非递归先序输出
3.2非递归中序输出
3.3非递归后序输出
4.层次遍历二叉树
5.求树高
6.求树叶子节点
7.按值查找对应节点,输出左孩子结点值和右孩子结点值

8.计算所有节点数

/*
二叉树实现
	1.创建二叉树
	2.递归输出二叉树
		2.1递归先序输出
		2.2递归中序输出
		2.3递归后序输出
	3.非递归输出
		3.1非递归先序输出
		3.2非递归中序输出
		3.3非递归后序输出
	4.层次遍历二叉树
	5.求树高
	6.求树叶子节点
	7.按值查找对应节点,输出左孩子结点值和右孩子结点值
	8.计算所有节点数
*/
#include<iostream>
#include<string>
#include<stack>
#include<deque>
#include<fstream>
using namespace std;

//const int MAX_N = 100;
//数据节点
class Node
{
public:
	char data;//数据
	class Node *lchild;//左节点
	class Node *rchild;//右节点
};

//二叉树
class Tree
{
public:
	Tree(){}
	~Tree(){}

	//构建二叉树
	void Create(string name)
	{
		ifstream readfile;
		string str;
		readfile.open(name);
		if (readfile.is_open())
		{
			getline(readfile, str);//读取一行
		}
		readfile.close();
		CreateNode(str);//构建二叉树
	}


	//先序遍历非递归算法
	void Disp()
	{
		if (t == NULL)
		{
			return;
		}
		stack<Node *> m_stack;//定义栈
		m_stack.push(t);
		while (!m_stack.empty())
		{
			Node *p = m_stack.top();//赋值一份当前双亲节点
			cout << p->data << ends;
			m_stack.pop();
			if (p->rchild)//先存储右子树,确保先输出左子树
			{
				m_stack.push(p->rchild)
二叉树是一种非常常见的数据结构,它由一个根节点以及每个节点最多有两个子节点组成。以下是二叉树基本操作及其c++代码实现: 1. 创建一个二叉树 ```c++ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode* createTree() { int val; cin >> val; if (val == -1) { return NULL; } TreeNode* root = new TreeNode(val); root->left = createTree(); root->right = createTree(); return root; } ``` 2. 二叉树的遍历(前序遍历、中序遍历、后序遍历) ```c++ // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); cout << root->val << " "; inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val << " "; } ``` 3. 求二叉树的深度 ```c++ int maxDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return max(leftDepth, rightDepth) + 1; } ``` 4. 判断是否为平衡二叉树 ```c++ bool isBalanced(TreeNode* root) { if (root == NULL) { return true; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); if (abs(leftDepth - rightDepth) > 1) { return false; } return isBalanced(root->left) && isBalanced(root->right); } ``` 5. 判断是否为对称二叉树 ```c++ bool isSymmetric(TreeNode* root) { if (root == NULL) { return true; } return isSymmetricHelper(root->left, root->right); } bool isSymmetricHelper(TreeNode* leftNode, TreeNode* rightNode) { if (leftNode == NULL && rightNode == NULL) { return true; } if (leftNode == NULL || rightNode == NULL) { return false; } if (leftNode->val != rightNode->val) { return false; } return isSymmetricHelper(leftNode->left, rightNode->right) && isSymmetricHelper(leftNode->right, rightNode->left); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值