{ BiTree T = (BiTree)malloc(sizeof(BiTreeNode)); T->data = c; T->leftChild = CreatePreTree(); T->rightChild = CreatePreTree(); return T; }怎么理解这串代码
时间: 2024-03-31 17:36:30 浏览: 6
这段代码是用来创建一棵二叉树的。具体来说,它使用了递归的方式来实现先序遍历构建二叉树。其中,参数 c 表示当前节点的值,T 表示当前节点,leftChild 表示当前节点的左子树,rightChild 表示当前节点的右子树。在递归过程中,代码会先创建当前节点,然后再递归创建左子树和右子树,最后返回当前节点。这个过程会一直持续到遍历完整棵树,返回根节点。需要注意的是,由于是用 malloc 函数动态分配内存,所以在使用完二叉树后需要手动释放内存,否则会造成内存泄漏。
相关问题
改正一段代码:#include <stdlib.h> #include <stdio.h> typedef struct Node { int data; struct Node* left; struct Node* right; }BiTreeNode,*BiTree; void Initiate(BiTree *root,DataType x){ *root=(BiTree)mallco(sizeof(BiTreeNode)); (*root)->data=x; (*root)->left=NULL; (*root)->right=NULL; } BiTree InsertLeftNode(BiTree curr,DataType x) { BiTree s,t; if(curr==NULL) return NULL; t=curr->left; s=(BiTree)mallloc(sizeof(BiTreeNode)); s->data=x; s->left=t; s->right=NULL; vurr->left=s; return curr->left; } BiTree InsertRightNode(BiTree curr.DataType x) { BiTree s,t; if(curr==NULL) return NULL; t=curr->right; s=(BiTree)mallloc(sizeof(BiTreeNode)); s->data=x; s->right=t; s->left=NULL; vurr->left=s; return curr->right; } typedef char DataType; void main(void) { InsertRightNode *root, *p; Initiate(&root); p = InsertLeftNode(root, 'A'); p = InsertLeftNode(p, 'B'); p = InsertLeftNode(p, 'D'); p = InsertRightNode(p, 'G'); p = InsertRightNode(root->left, 'C'); InsertLeftNode(p, 'E'); InsertRightNode(p, 'F'); } void PrintBiTree(BiTreeNode *bt, int n) { int i; if(bt == NULL) return; PrintBiTree(bt->right, n+1); for(i = 0; i < n-1; i++) printf(“ ”); // 打印3个空格 if(n > 0) { printf(“---”); printf(“%c\n”, bt->data); } PrintBiTree(bt->left, n+1); }
改正后的代码如下:
```c
#include <stdlib.h>
#include <stdio.h>
typedef char DataType;
typedef struct BiTreeNode {
int data;
struct BiTreeNode* left;
struct BiTreeNode* right;
} BiTreeNode, *BiTree;
void Initiate(BiTree* root, DataType x) {
*root = (BiTree)malloc(sizeof(BiTreeNode));
(*root)->data = x;
(*root)->left = NULL;
(*root)->right = NULL;
}
BiTree InsertLeftNode(BiTree curr, DataType x) {
BiTree s, t;
if (curr == NULL) return NULL;
t = curr->left;
s = (BiTree)malloc(sizeof(BiTreeNode));
s->data = x;
s->left = t;
s->right = NULL;
curr->left = s;
return curr->left;
}
BiTree InsertRightNode(BiTree curr, DataType x) {
BiTree s, t;
if (curr == NULL) return NULL;
t = curr->right;
s = (BiTree)malloc(sizeof(BiTreeNode));
s->data = x;
s->right = t;
s->left = NULL;
curr->right = s;
return curr->right;
}
void PrintBiTree(BiTreeNode* bt, int n) {
int i;
if (bt == NULL) return;
PrintBiTree(bt->right, n + 1);
for (i = 0; i < n - 1; i++) printf(" "); // 打印3个空格
if (n > 0) {
printf("---");
printf("%c\n", bt->data);
}
PrintBiTree(bt->left, n + 1);
}
int main(void) {
BiTree root, p;
Initiate(&root, 'A');
p = InsertLeftNode(root, 'B');
p = InsertLeftNode(p, 'D');
p = InsertRightNode(p, 'G');
p = InsertRightNode(root->left, 'C');
InsertLeftNode(p, 'E');
InsertRightNode(p, 'F');
PrintBiTree(root, 0);
return 0;
}
```
#include<stdio.h> #include<iostream.h> #include<stdlib.h> typedef char ElementType; typedef struct TNode { ElementType Data; struct TNode *left, *right; }TNode, *BiTree; void InOrderTraverse(BiTree T) { if(T) { InOrderTraverse(T->left); cout<<T->Data; InOrderTraverse(T->right); } } void Preorder_Traversal(BiTree T) { if(!T)return; cout<<T->Data; Preorder_Traversal(T->left); Preorder_Traversal(T->right); } void Postorder_Traversal(BiTree T) { if(!T)return; Postorder_Traversal(T->left); Postorder_Traversal(T->right); cout<<T->Data; } int Depth(BiTree T) { int m,n; if(T==NULL) return 0; else { m=Depth(T->left); n=Depth(T->right); if(m>n) return(m+1); else return(n+1); } } int NodeCount(BiTree T) { if(T==NULL) return 0; else return NodeCount(T->left)+NodeCount(T->right)+1; } int CountLeaf(BiTree* T, int* count) { if (T!=NULL&&(T->left)== NULL&&(T->right)==NULL) { (*count)++; } if (T!= NULL) { CountLeaf(T->left, count); CountLeaf(T->reght, count); } return *count; }
这段代码有很多问题,我来一一指出:
1. `#include<iostream.h>` 应该改为 `#include<iostream>`,因为 `<iostream.h>` 是旧版 C++ 标准库,现在已经被弃用。
2. 在 `CountLeaf` 函数中,`T` 是一个指向指针的指针,应该改为 `BiTree T`。
3. 在 `CountLeaf` 函数中,`T->reght` 应该改为 `T->right`。
4. 在 `CountLeaf` 函数中,`count` 是一个指向 `int` 类型的指针,应该改为 `int& count`,这样才能在递归中正确累加叶子结点的数量。
5. 在 `CountLeaf` 函数中,应该在最开始将 `*count` 初始化为 0,否则会返回一个随机值。
6. 在 `CountLeaf` 函数中,应该在递归结束后返回累加后的叶子结点数量,否则会返回一个随机值。
下面是修改后的代码:
```c++
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef char ElementType;
typedef struct TNode
{
ElementType Data;
struct TNode *left, *right;
}TNode, *BiTree;
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->left);
cout<<T->Data;
InOrderTraverse(T->right);
}
}
void Preorder_Traversal(BiTree T)
{
if(!T)return;
cout<<T->Data;
Preorder_Traversal(T->left);
Preorder_Traversal(T->right);
}
void Postorder_Traversal(BiTree T)
{
if(!T)return;
Postorder_Traversal(T->left);
Postorder_Traversal(T->right);
cout<<T->Data;
}
int Depth(BiTree T)
{
int m,n;
if(T==NULL) return 0;
else
{
m=Depth(T->left);
n=Depth(T->right);
if(m>n)
return(m+1);
else
return(n+1);
}
}
int NodeCount(BiTree T)
{
if(T==NULL)
return 0;
else
return NodeCount(T->left)+NodeCount(T->right)+1;
}
int CountLeaf(BiTree T, int& count)
{
if (T == NULL) {
return 0;
}
if (T->left == NULL && T->right == NULL) {
count++;
}
CountLeaf(T->left, count);
CountLeaf(T->right, count);
return count;
}
int main()
{
BiTree T = new TNode;
T->Data = 'A';
T->left = new TNode;
T->left->Data = 'B';
T->left->left = NULL;
T->left->right = NULL;
T->right = new TNode;
T->right->Data = 'C';
T->right->left = new TNode;
T->right->left->Data = 'D';
T->right->left->left = NULL;
T->right->left->right = NULL;
T->right->right = new TNode;
T->right->right->Data = 'E';
T->right->right->left = NULL;
T->right->right->right = NULL;
cout << "Inorder traversal: ";
InOrderTraverse(T);
cout << endl;
cout << "Preorder traversal: ";
Preorder_Traversal(T);
cout << endl;
cout << "Postorder traversal: ";
Postorder_Traversal(T);
cout << endl;
cout << "Depth: " << Depth(T) << endl;
cout << "Node count: " << NodeCount(T) << endl;
int count = 0;
cout << "Leaf count: " << CountLeaf(T, count) << endl;
return 0;
}
```