【C++】链式二叉树的生成、遍历

实现以下树的代码

在这里插入图片描述

#include<iostream>
using namespace std;
struct BTNode {
    
    
	char data;
	struct BTNode* pLchild;
	struct BTNode* pRchild;
 };
BTNode* CreatBTree();
void PreTraverseBTree(BTNode*);
void InTraverseBTree(BTNode*);
void PostTraverseBTree(BTNode*);
int main() {
    
    
	BTNode* pT = CreatBTree();
	cout << "先序遍历:";
	PreTraverseBTree(pT);
	cout << "\n";
	cout << "中序遍历:";
	InTraverseBTree(pT);
	cout << "\n";
	cout << "后序遍历:";
	PostTraverseBTree(pT);
	return 0;
}
BTNode* CreatBTree() {
    
    
	BTNode* pA = new BTNode();
	BTNode* pB = new BTNode();
	BTNode* pC = new BTNode();
	BTNode* pD = new BTNode();
	BTNode* pE = new BTNode();

	pA->data = 'A';
	pB->data = 'B';
	pC->data = 'C';
	pD->data = 'D';
	pE->data = 'E';

	pA->pLchild = pB;
	pA->pRchild = pC;
	pB->pLchild = pB->pRchild = NULL;
	pC->pLchild = pD;
	pC->pRchild = NULL;
	pD->pRchild = pE;
	pD->pLchild = NULL;
	pE->pLchild = pE->pRchild = NULL;

	return pA;
}
void PreTraverseBTree(BTNode *pT) {
    
    
	if (pT != NULL) {
    
    
		cout << pT->data << " ";
		PreTraverseBTree(pT->pLchild);
		PreTraverseBTree(pT->pRchild);
	}
}

void InTraverseBTree(BTNode*pT)
{
    
    
	if (pT != NULL) {
    
    
		InTraverseBTree(pT->pLchild);
		cout << pT->data << " ";
		InTraverseBTree(pT->pRchild);
	}
}

void PostTraverseBTree(BTNode* pT)
{
    
    
	if (pT != NULL) {
    
    
		PostTraverseBTree(pT->pLchild);
		PostTraverseBTree(pT->pRchild);
		cout << pT->data << " ";
	}
}

在这里插入图片描述

#include<iostream>
using namespace std;
#include<vector>
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) {
    
    }
	
};
TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int h1, int t1, int h2, int t2) {
    
    
	if (h1 > t1 || h2 > t2)
		return NULL;
	TreeNode* root = new TreeNode(preorder[h1]);
	if (h1 == t1)
		return root;
	int mid = 0;
	while (inorder[h2 + mid] != root->val)
		mid++;
	root->left = dfs(preorder, inorder, h1 + 1, h1 + mid, h2, h2 + mid - 1);
	root->right = dfs(preorder, inorder, h1 + mid + 1, t1, h2 + mid + 1, t2);
	return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
	int n = preorder.size();
	if (n == 0)
		return NULL;
	return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
}

void PreTraverseBTree(TreeNode*root) {
    
    
	if (root != NULL) {
    
    
		cout << root->val << " ";
		PreTraverseBTree(root->left);
		PreTraverseBTree(root->right);
	}
}
void InTraverseBTree(TreeNode* root) {
    
    
	if (root != NULL) {
    
    
		InTraverseBTree(root->left);
		cout << root->val << " ";
		InTraverseBTree(root->right);
	}

}
void PostTraverseBTree(TreeNode* root) {
    
    
	if (root != NULL) {
    
    
		PostTraverseBTree(root->left);
		PostTraverseBTree(root->right);
		cout << root->val << " ";
	}
}
int main() {
    
    
	vector<int> preorder = {
    
    3,9,20,15,7};
	vector<int> inorder = {
    
    9,3,15,20,7};
	TreeNode* root = buildTree(preorder, inorder);
	PreTraverseBTree(root);
	cout << "\n";
	InTraverseBTree(root);
	cout << "\n";
	PostTraverseBTree(root);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_48180029/article/details/113612391