数据结构树结构,二叉树,二叉树操作,源代码,Tree Structure,Binary Tree,source code

软件和网站开发以及相关技术探讨
回复
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

数据结构树结构,二叉树,二叉树操作,源代码,Tree Structure,Binary Tree,source code

#1

帖子 flyinflash » 2008-07-06 9:45

代码: 全选

//  Tree Structure | Binary Tree
//  linked storage form

//  Last Modified: 2008-06-16
//  Last Modified: 2008-07-05

#include <stdio.h>
#include <stdlib.h>


typedef struct node
{
  char data;
  struct node *left, *right;
} node, *tree;

void create(tree *t);
void preorder_traverse(tree t);
void inorder_traverse(tree t);
void postorder_traverse(tree t);
int get_depth(tree t);
void get_leaf(tree t);

int leaves = 0;


void create(tree *t)
{
  int key = getchar();
  
  if (key != '.')
  {
    *t = (tree)malloc(sizeof(node));
    if (*t == NULL)
      printf("\n overflow ");

    (*t)->data = key;
    create(&((*t)->left));
    create(&((*t)->right));
  }
  else
  {
    *t = NULL;
  }
}


void preorder_traverse(tree t)
{
  if (t)
  {
    printf("\n %c ", t->data);
    preorder_traverse(t->left);
    preorder_traverse(t->right);
  }
}


void inorder_traverse(tree t)
{
  if (t)
  {
    inorder_traverse(t->left);
    printf("\n %c ", t->data);
    inorder_traverse(t->right);
  }
}


void postorder_traverse(tree t)
{
  if (t)
  {
    postorder_traverse(t->left);
    postorder_traverse(t->right);
    printf("\n %c ", t->data);
  }
}


int get_depth(tree t)
{
	int hl, hr, depth;
	
	if (t != NULL)
	{
		hl = get_depth(t->left);
		hr = get_depth(t->right);
		depth = (hl > hr) ? hl : hr;
		return depth + 1;
	}
	else
	{
		return 0;
	}
}


void get_leaf(tree t)
{
	if (t)
	{
		if (!t->left && !t->right)
		{
			printf("\n leaf = %c ", t->data);
			leaves++;
		}
		get_leaf(t->left);
		get_leaf(t->right);
	}
}

int main()
{
  tree t;

  printf("\n");
  printf("\n		Create Tree ");
  printf("\n");
  printf("\n		1234567890");
  printf("\n		");
  create(&t);
  
  printf("\n");
  printf("\n		Preorder Traverse Tree ");
  printf("\n");
  preorder_traverse(t);
  
  printf("\n");
  printf("\n		Inorder Traverse Tree ");
  printf("\n");
  inorder_traverse(t);
  
  printf("\n");
  printf("\n		Postorder Traverse Tree ");
  printf("\n");
  postorder_traverse(t);
  
  
  printf("\n");
  printf("\n		Depth: %d ", get_depth(t));
  
  
  printf("\n");
  printf("\n		Leaves of Tree ");
  get_leaf(t);
  
  printf("\n");
  printf("\n		Leaves: %d ", leaves);
  
  
  printf("\n");
  
  return 0;
} 
上次由 flyinflash 在 2008-07-06 15:23,总共编辑 1 次。
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#2

帖子 flyinflash » 2008-07-06 9:47

比较上面与它的差异
viewtopic.php?t=132203&highlight=
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#3

帖子 flyinflash » 2008-07-06 9:48

代码: 全选

typedef struct node
{
  struct node *left;
  data datas;
  struct node *right;
} node, *tree; 
...
void insert(tree t, char *msg);

void insert(tree t, char *msg) 
{
...
}

int main(int argc, char** argv)
{
  tree t; 
...
}
头像
linlee
帖子: 1132
注册时间: 2007-10-20 11:30

#4

帖子 linlee » 2008-07-06 11:12

好长.....
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#5

帖子 flyinflash » 2008-07-06 14:22

不就几行……

其它我想说,为什么3楼的写法在C++下编译没问题,但是在C下有问题

代码: 全选

...
    (*t)->data = key;
    create(&((*t)->left));
    create(&((*t)->right));
...
上面 的

代码: 全选

&((*t)
不好理解
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

#6

帖子 nobrain » 2008-07-06 18:08

flyinflash 写了:不就几行……

其它我想说,为什么3楼的写法在C++下编译没问题,但是在C下有问题

代码: 全选

...
    (*t)->data = key;
    create(&((*t)->left));
    create(&((*t)->right));
...
那个data是个什么类型?在哪里定义了?
flyinflash 写了:上面 的

代码: 全选

&((*t)
不好理解
t是指向tree的实例的指针,*t代表一个tree的实例,tree是指向一个struct node实例的指针。
(*t)->left是一个tree的实例,&((*t)->left)取这个tree实例的地址。
爱喝真猪奶茶的夜鸣猪
回复