算法:树相关练习
1:变量与地址:通过树所里理解到的
#最近在刷数据结构中与树相关的题目,遇到一个很有意思的点,记录下来,防止自己忘记:
先看下面这一段代码,初始化一个树:
定义一段树的结构体:
Step1:
typedef struct BINARYNNODE {
char val;
struct BINARYNNODE* lchind;
struct BINARYNNODE* rchild;
}BinaryNode;
这个没有问题,上面是数据域,下面是指针域
Step2:初始化树的节点,以及建立树。直接在Create Tree函数声明 Binarytree结构体变量,然后对变量直接赋值。通过left 与right 指针建立联系。到下面为止都没有任何问题
void CreateTree()
{
BinaryNode node1 = { ‘A’,NULL,NULL };
BinaryNode node2 = { ‘B’,NULL,NULL };
BinaryNode node3 = { ‘C’,NULL,NULL };
BinaryNode node4 = { ‘D’,NULL,NULL };
BinaryNode node5 = { ‘E’,NULL,NULL };
BinaryNode node6 = { ‘F’,NULL,NULL };
BinaryNode node7 = { ‘G’,NULL,NULL };
BinaryNode node8 = { ‘H’,NULL,NULL };
//create relation;
node1.lchind = &node2;
node1.rchild = &node6;
node2.lchind = &node3;
node3.lchind = &node4;
node3.rchild = &node5;
node6.rchild = &node7;
node7.lchind = &node8;
Recursion(&node1);
count = 0;
CalculateDepth(&node1);
return ;
}
但是下面有两个函数Reccursion and CalculateDepth. 与CreateTree 耦合在一起,现在想把他们分开。在外面调用Node.用下面的方法:
BinaryNode* CreateTree()
{
BinaryNode node1 = { ‘A’,NULL,NULL };
BinaryNode node2 = { ‘B’,NULL,NULL };
BinaryNode node3 = { ‘C’,NULL,NULL };
BinaryNode node4 = { ‘D’,NULL,NULL };
BinaryNode node5 = { ‘E’,NULL,NULL };
BinaryNode node6 = { ‘F’,NULL,NULL };
BinaryNode node7 = { ‘G’,NULL,NULL };
BinaryNode node8 = { ‘H’,NULL,NULL };
//create relation;
node1.lchind = &node2;
node1.rchild = &node6;
node2.lchind = &node3;
node3.lchind = &node4;
node3.rchild = &node5;
node6.rchild = &node7;
node7.lchind = &node8;
Return &node1 ;
}
这么写有没有问题?你会发现在外边调用node1地址丢了,不知道指向哪里了:你可以试试调用一下
比如CalculateDepth();那么正确的做法是怎样的呢?正确的做法是不能直接定义结构体变量,而是想定义结构体指针,并且返回指针变量,因为这时候返回的指针指向的地址:
inaryNode* CreateTreeNode()
{
BinaryNode* node1 = (BinaryNode*)malloc(sizeof(BinaryNode));
node1->val = ‘A’;
node1->lchind = NULL;
node1->rchild = NULL;
BinaryNode* node2 = (BinaryNode*)malloc(sizeof(BinaryNode));
node2->val = ‘B’;
node2->lchind = NULL;
node2->rchild = NULL;
BinaryNode* node3 = (BinaryNode*)malloc(sizeof(BinaryNode));
node3->val = ‘C’;
node3->lchind = NULL;
node3->rchild = NULL;
//Build relation:
node1->lchind = node2;
node1->rchild = node3;
return node1;
}