数据结构 二叉树 创建 遍历

二叉树的结构比较简单,就不罗嗦了,直接看源代码:

为了以后快速查找,我还是简单说下怎么输入数据,如下图所示的数据结构:

 

二叉树输入示列

像这样的数据结构我们怎么输入呢?

第一次输入ab#,然后回车。

第二次输入c##,然后回车。

第三次输入d#,然后回车。

第四次输入g##,然后回车。

不知道以后的我或者网友是否看明白呢?希望以后的我和大家领悟能力比我现在这些苍白的文字强n的XX次方!

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream.h> #define MAXSIZE 32 typedef char DataType; typedef struct _BiTreeNode { DataType data; struct _BiTreeNode *left, *right; }BiTreeNode, *BiTree; //创建二叉树方法1 void CreateBiTree_1( BiTree &t ) { DataType ch; printf( "请按先序查找的方式依次输入数据,并以#标志结束:/n" ); cin >> ch; //如果用scanf函数,回车字符会被输进去,增添不确定性 // scanf( "%c", &ch ); if( ch == '#' ) t = NULL; else { t = ( BiTree )malloc( sizeof( BiTreeNode ) ); if( t ) { t->data = ch; CreateBiTree_1( t->left ); CreateBiTree_1( t->right ); } } } //创建二叉树方法2 BiTree CreateBiTree_2() { BiTree t; DataType ch; printf( "请按先序查找的方式依次输入数据,并以#标志结束:/n" ); cin >> ch; //如果用scanf函数,回车字符会被输进去,增添不确定性 // scanf( "%c", &ch ); if( ch == '#' ) t = NULL; else { t = ( BiTree )malloc( sizeof( BiTreeNode ) ); if( t ) { t->data = ch; t->left = CreateBiTree_2(); t->right = CreateBiTree_2(); } } return t; } //由广义表的方式创建二叉树 //#表示该节点没有数据 void CreateBiTree_3( BiTree &t, char *str ) { BiTree stack[MAXSIZE], p = NULL; int i = 0, k, top = -1; char ch = str[i]; t = NULL; while( ch ) { switch( ch ) { case '(': stack[++top] = p; //进栈操作 k = 1; //对左子树的动作 break; case ')': //出栈操作 top--; break; case ',': k = 2; //对右子树的动作 break; case '#': //该节点没有数据 break; default: p = ( BiTree )malloc( sizeof( BiTreeNode ) ); p->data = ch; p->left = p->right = NULL; if( t == NULL ) t = p; else { switch( k ) { case 1: stack[top]->left = p; break; case 2: stack[top]->right = p; break; } } }//end switch ch = str[++i]; }//end while } //计算二叉树深度 int depth( BiTree t ) { if( t == NULL ) return 0; int ld, rd; ld = depth( t->left ); rd = depth( t->right ); if( ld > rd ) return ld+1; else return rd+1; } //递归式先序遍历 void PreOrder( BiTree t ) { if( !t ) return; else { printf( "%c /n", t->data ); PreOrder( t->left ); PreOrder( t->right ); } } //递归式中序遍历 void InOrder( BiTree t ) { if( !t ) return; else { PreOrder( t->left ); printf( "%c /n", t->data ); PreOrder( t->right ); } } //递归式后序遍历 void PostOrder( BiTree t ) { if( !t ) return; else { PreOrder( t->left ); PreOrder( t->right ); printf( "%c /n", t->data ); } } //先序遍历二叉树非递归算法 void PreOrder_2( BiTree t ) { BiTree stack[MAXSIZE], p; int top = 0; stack[top++] = t; while( top > 0 ) { p = stack[ --top ]; printf( "%c /n", p->data ); if( p->left ) stack[top++] = p->left; if( p->right ) stack[top++] = p->right; } } int main( void ) { BiTree t; int i = 0; char *str = "(a(b(#,c(#,#)),d(#,g(#,#))))"; //CreateBiTree_1( t ); //创建二叉树方法1 //t = CreateBiTree_2( ); //创建二叉树方法2 CreateBiTree_3( t, str ); //创建二叉树方法3 i = depth( t ); printf( "%d /n", i ); // PreOrder( t ); // InOrder( t ); // PostOrder( t ); PreOrder_2( t ); return 0; }

你可能感兴趣的:(数据结构,c,算法,struct,C#,null)