树的孩子兄弟表示法
2012-09-02 22:31
316 查看
typedef struct DataType { }DataType; typedef struct Node { DataType element; struct Node * pFirstChild; struct Node * pNextSibling; }*Tree,*Queue;
树的先序递归遍历:
void TraverseTree(Tree p) { if(p==NULL) return; cout<<p->element<<endl; TraverseTree(p->pFirstChild); TraverseTree(p->pNextSibling); }
上面输出结果:访问顺序 A B E C F I G H J K L D
数的先序非递归遍历:
void TraverseTree(Tree p) { if(p==NULL) return; cout<<p->element<<endl; TraverseTree(p->pNextSibling); TraverseTree(p->pFirstChild); }
上面输出结果:A B C D F G H J K L I E
void AddTree(Tree p,DataType parent,DataType element) { Queue queue; BOOL flag=FALSE; Tree tree; while (p||!Empty(queue)&&!flag) { while (p) { EnQueue(queue,p); p=p->pNextSibling; } if (!Empty(queue)) { p=Dequeue(queue); if (p->element==parent) { flag=TRUE; tree=p; break; } } } Tree temp1=tree->pFirstChild; Tree temp2=(Tree)malloc(sizeof(struct Node)); temp2->element=element; temp2->pFirstChild=NULL; temp2->pNextSibling=temp1; tree->pFirstChild=temp2; while (!Empty(queue)) { DeQueue(queue); } }
//删除节点:
(1)找到父节点
(2)修改父节点及兄弟节点的指向
(3)析构该节点所对应的树
析构一棵树:
(1)层次遍历树的节点,出队的时候free,把访问变成free,同时注意free之前保存其第一个孩子
//按层次遍历 void TraverseLayer(Tree p) { Queue queue; while (p||!empty(queue)) { while (p) { EnQueue(queue,p); p=p->pNextSibling; } if(!empty(queue)) { p=DeQueue(queue); cout<<p->element<<endl; p=p->pFirstChild; } else { return; } } }
输出结果 A B C D E F G H I JK L
Tree FindParent(Tree tree,DataType element) { Tree p=tree; BOOL flag=FALSE; Tree parent; Queue queue; while (p||!Empty(queue)&&!flag) { while (p) { EnQueue(queue,p); p=p->pNextSibling; } if (!EmptyQueue(queue)) { p=DeQueue(queue); Tree temp=p->pFirstChild; while (temp) { if (temp->element==element) { parent=p; flag=true; break; } } p=p->pFirstChild; } } while (!empty(queue)) { Dequeue(queue); } return parent; } int TreeDepth(Tree p) { if (p==NULL) { return 0; } p=p->pFirstChild; int max=0; while (p) { int depth=TreeDepth(p); if (max<depth) { max=depth; } p=p->pNextSibling; } return max+1; }
相关文章推荐
- 树的孩子兄弟表示法
- UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)
- 树-孩子兄弟表示法的实现
- 任意有根树的左孩子右兄弟表示法存储
- 构建树(孩子兄弟表示法)
- 普通二叉树转二叉链表(孩子兄弟表示法)
- VC++ 树的孩子兄弟表示法
- 普通二叉树转二叉链表(孩子兄弟表示法)
- poj 1470 Closest Common Ancestors tarjan求lca和树的孩子兄弟表示
- 左孩子右兄弟表示多叉树查找返回下一个节点
- UVa 11732 strcmp()函数(左孩子右兄弟表示法)
- 随意有根树的左孩子右兄弟表示法存储
- 求 以孩子-兄弟链表表示的树 的度、深度、叶结点和边
- C语言数据结构——孩子兄弟表示法
- 二叉树--兄弟孩子表示法
- 树的孩子兄弟表示法-因特网域名的查找
- DELPHI 孩子兄弟表示法 (递归实现)
- 孩子兄弟表示法(二叉链表树) 时间 2014-06-02 16:32:17 CSDN博客 原文 http://blog.csdn.net/chdjj/article/details/2811164
- 层号表示法转孩子兄弟表示法(二叉树)
- 软件设计师2006年11月下午试题5(C语言 树及其孩子-兄弟表示)