赞
踩
标签(空格分隔): 学习笔记
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。
二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有
二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
struct TreeNode
{
int val;
TreeNode *left, *right;
};
采用递归的方法前序(根左右)建立二叉树,以#符号表示此当前数值为空。
TreeNode* CreateBiTree()
{
char ch;
TreeNode* T;
scanf_s("%c", &ch);
if (ch == '#')
{
T = NULL;
}
else
{
T = (TreeNode*)malloc(sizeof(TreeNode));
T->val = ch;
T->left = CreateBiTree();
T->right = CreateBiTree();
}
return T;//返回根节点
}
测试图像:
测试结果:
序是根据树根的遍历位置来说的,前序就是先遍历根,后遍历左右子节点
比如这样的树
A
/ \
B C
根是A,前序遍历就是ABC,中序就是BAC,后序就是BCA,根据A的位置决定
void PreOrderTraverse(TreeNode* T)
{
if (T)
{
printf("%c", T->val);
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
}
//中序遍历二叉树
void MidOrderTraverse(TreeNode* T)
{
if (T)
{
MidOrderTraverse(T->left);
printf("%c->", T->val);
MidOrderTraverse(T->right);
}
}
//后序遍历二叉树
void BackOrderTraverse(TreeNode* T)
{
if (T)
{
BackOrderTraverse(T->left);
BackOrderTraverse(T->right);
printf("%c->", T->val);
}
}
采用层次遍历的方式递归遍历二叉树的所有元素;
void levelTraverse(TreeNode* T)
{
vector<TreeNode*> vec;
vec.push_back(T);
int cur = 0;
int end = 1;
while (cur < vec.size())
{
end = vec.size();
while (cur < end)
{
cout << vec[cur]->data << " ";
if (vec[cur]->lchild)
vec.push_back(vec[cur]->lchild);
if (vec[cur]->rchild)
vec.push_back(vec[cur]->rchild);
cur++;
}
cout << endl;
}
}
运行结果如下图所示:
给定一个二叉树,其最大深度指的是根节点到所有叶子节点中的最大距离。同样采用递归的方式遍历二叉树,没遍历一次,计数器+1;
int maxDepth(TreeNode *root)
{
// write your code here
if(root == NULL)
{
return 0;
}
int max_left=1;
int max_right=1;
if(root->left != NULL)
{
max_left = maxDepth(root->left) + 1;
}
if(root->right != NULL)
{
max_right = maxDepth(root->right) + 1;
}
return max_left>max_right?max_left:max_right;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。