二叉树的递归遍历c语言
时间: 2023-11-24 14:08:40 浏览: 109
以下是二叉树的递归遍历C语言代码:
1. 前序遍历
```c
void PreOrder(BTNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data); // 先访问根节点
PreOrder(root->left); // 再遍历左子树
PreOrder(root->right); // 最后遍历右子树
}
```
2. 中序遍历
```c
void InOrder(BTNode* root) {
if (root == NULL) {
return;
}
InOrder(root->left); // 先遍历左子树
printf("%d ", root->data); // 再访问根节点
InOrder(root->right); // 最后遍历右子树
}
```
3. 后序遍历
```c
void PostOrder(BTNode* root) {
if (root == NULL) {
return;
}
PostOrder(root->left); // 先遍历左子树
PostOrder(root->right); // 再遍历右子树
printf("%d ", root->data); // 最后访问根节点
}
```
相关问题
c语言二叉树递归遍历
对于C语言的二叉树递归遍历,可以分为先序遍历、中序遍历和后序遍历。先序遍历是先访问根结点,然后递归遍历左子树和右子树。中序遍历是先递归遍历左子树,然后访问根结点,最后递归遍历右子树。后序遍历是先递归遍历左子树和右子树,最后访问根结点。
以下是C语言中二叉树递归遍历的代码示例:
先序遍历:
```c
void PreOrderTraverse(BiTree T) {
if(T == NULL) {
return;
}
printf("%C",T->data); //显示结点数据
PreOrderTraverse(T->lchild); //先序遍历左子树
PreOrderTraverse(T->rchild);//最后先序遍历右子树
}
```
中序遍历:
```c
void InOrderTraverse(BiTree T) {
if(T == NULL) {
return;
}
InOrderTraverse(T->lchild); //中序遍历左子树
printf("%C",T->data); //显示结点数据
InOrderTraverse(T->rchild);//最后中序遍历右子树
}
```
后序遍历:
```c
void PostOrderTraverse(BiTree T) {
if(T == NULL) {
return;
}
PostOrderTraverse(T->lchild); //后续序遍历左子树
PostOrderTraverse(T->rchild);//后序遍历右子树
printf("%C",T->data); //显示结点数据
}
```
请问还有其他相关问题吗?
相关问题:
1. 请问C语言中如何实现二叉树的非递归遍历?
2. 如何计算二叉树的高度?
3. 如何从文件中读取二叉树并以文件的形式输出遍历结果?
二叉树的递归遍历和非递归遍历c语言代码
二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。其中,递归遍历是比较常见的方式,而非递归遍历则需要借助栈的数据结构实现。
下面给出二叉树的递归遍历和非递归遍历的C语言代码实现:
1. 二叉树的递归遍历
前序遍历:
```
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val); // 访问根节点
preorderTraversal(root->left); // 递归遍历左子树
preorderTraversal(root->right); // 递归遍历右子树
}
```
中序遍历:
```
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left); // 递归遍历左子树
printf("%d ", root->val); // 访问根节点
inorderTraversal(root->right); // 递归遍历右子树
}
```
后序遍历:
```
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left); // 递归遍历左子树
postorderTraversal(root->right); // 递归遍历右子树
printf("%d ", root->val); // 访问根节点
}
```
2. 二叉树的非递归遍历
前序遍历:
```
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
printf("%d ", node->val); // 访问节点
if (node->right != NULL) {
st.push(node->right); // 右子节点先入栈,保证左子节点先出栈
}
if (node->left != NULL) {
st.push(node->left);
}
}
}
```
中序遍历:
```
void inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* node = root;
while (!st.empty() || node != NULL) {
if (node != NULL) { // 当前节点不为空,继续将其左子节点入栈
st.push(node);
node = node->left;
} else { // 当前节点为空,说明已经到达最左侧,开始出栈访问节点
node = st.top();
st.pop();
printf("%d ", node->val); // 访问节点
node = node->right; // 开始访问右子节点
}
}
}
```
后序遍历:
```
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> st1, st2;
st1.push(root);
while (!st1.empty()) {
TreeNode* node = st1.top();
st1.pop();
st2.push(node); // 先将当前节点入栈st2
if (node->left != NULL) {
st1.push(node->left); // 左子节点入栈st1
}
if (node->right != NULL) {
st1.push(node->right); // 右子节点入栈st1
}
}
while (!st2.empty()) { // 出栈访问节点
TreeNode* node = st2.top();
st2.pop();
printf("%d ", node->val);
}
}
```
阅读全文