洛谷P1305: 新二叉树
题目描述
输入一串二叉树,输出其前序遍历
样例
第一行为二叉树的节点数 n(1≤n≤26)
后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 * 表示
输出格式: 二叉树的前序遍历
输入
6
abc
bdi
cj*
d**
i**
j**
输出
abdicj
算法 递归
- 使用左右指针建树
- 建立树的根节点创建左右节点
- 查找给定数值对应的节点,重复建立节点
- 递归前序遍历
时空分析
时间复杂度: 递归查找给定数值的节点,最坏的时间复杂度 O(n) , 遍历 n 次,时间复杂度最坏 O(n^2)
C++ 代码
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x = 0):val(x),left(NULL),right(NULL){}
};
void preOrder(TreeNode* root)
{
if (root)
cout<<root->val;
else
return;
preOrder(root->left);
preOrder(root->right);
}
TreeNode* CreateNode(char ch)
{
if (ch=='*')
return NULL;
return new TreeNode(ch);
}
//在root树中寻找节点数值为ch的子树
TreeNode* find_tree(TreeNode* root, char ch)
{
if (!root) return NULL;
if(root->val == ch) return root;
TreeNode* target = NULL;
if (root->left) target = find_tree(root->left, ch);
if (target) return target;
if (root->right) target = find_tree(root->right, ch);
return target;
}
int main()
{
int num;
char val1,val2,val3;
cin >> num;
cin >> val1>>val2>>val3;
TreeNode*root = new TreeNode(val1);
root->left = CreateNode(val2);
root->right = CreateNode(val3);
for (int i = 1; i < num; i++)
{
cin >> val1 >> val2 >> val3;
TreeNode*_root = find_tree(root, val1);
_root->left = CreateNode(val2);
_root->right = CreateNode(val3);
}
//前序遍历
preOrder(root);
return 0;
}