求树高度的非递归算法

来源:互联网 发布:日本动漫知子 编辑:程序博客网 时间:2024/05/17 00:53

突然想到前不久看到的一个简单的算法题,非递归得求一个二叉树(其实什么树方法是一样的)的高度


想到一个思路 就是 取两个栈或者队列,将根塞入第一个队列 然后:

1.当 第一个队列不为空时,取出所有的第一个队列中树的非空子节点 塞入第二个队列中

2.将 第二个节点的所有树 塞回第一个队列,令计数器加一

以此循环 直到第一个队列为空


一下是使用栈求AVL树的非递归方法(套用了之前文章的AVL树实现的基本例程)


#include<stdio.h>#include<stdlib.h>typedef struct Tree{int Num;Tree* Left;Tree* Right;int Height;}Tree;typedef struct Stack{Tree * tree;Stack* Next;}Stack;Stack *Head;Tree *SingleRotateWithLeft(Tree *tree);Tree *SingleRotateWithRight(Tree *tree);Tree *DoubleRotateWithRight(Tree *tree);Tree *DoubleRotateWithLeft(Tree *tree);void Push(Stack* Head, Tree* tree){Stack*Temp = NULL;if (NULL == Head->Next){Temp = (Stack*)malloc(sizeof(Stack));Temp->tree = tree;Temp->Next = NULL;Head->Next=Temp;return;}if (NULL != Head->Next){Temp = (Stack*)malloc(sizeof(Stack));Temp->tree = tree;Temp->Next = Head->Next;Head->Next=Temp;return;}}Tree* Pop(Stack*Head){if (NULL == Head->Next)return NULL;if (NULL != Head->Next){Stack * ToFree = Head->Next;Tree* Temp = ToFree->tree;Head->Next = ToFree->Next;free(ToFree);return Temp;}}int Max(int a, int b){return a>b ? a : b;}int Height(Tree*tree){if (NULL == tree)return -1;elsereturn tree->Height;}Tree* AVL_Insert(Tree *root, int num){Tree * tree = root;/*找到插入位置,并将路径上的节点推入栈中*/while (1){if (tree == NULL){/*生成节点*/tree = (Tree*)malloc(sizeof(Tree));tree->Num = num;tree->Left = NULL;tree->Right = NULL;tree->Height = 0;Push(Head, tree);break;}if (num < tree->Num){Push(Head, tree);tree = tree->Left;continue;}if (num > tree->Num){Push(Head, tree);tree = tree->Right;continue;}}while (1){Tree *Temp = Pop(Head);Tree* AboveTree = Pop(Head);if (AboveTree == NULL){return Temp;}/*若左节点比右节点 高 2个单位*/if (Temp->Num < AboveTree->Num){AboveTree->Left = Temp;  if (Height(AboveTree->Left) - Height(AboveTree->Right) == 2){if (num < Temp->Num)AboveTree= SingleRotateWithLeft(AboveTree);else if (num > Temp->Num)AboveTree = DoubleRotateWithLeft(AboveTree);}}else if (Temp->Num > AboveTree->Num){AboveTree->Right = Temp;if (Height(AboveTree->Left) - Height(AboveTree->Right) == -2){if (num < Temp->Num)AboveTree = DoubleRotateWithRight(AboveTree);else if (num > Temp->Num)AboveTree = SingleRotateWithRight(AboveTree);}}AboveTree->Height = Max(Height(AboveTree->Left), Height(AboveTree->Right)) + 1;Push(Head, AboveTree);}return root;}Tree *SingleRotateWithLeft(Tree *tree){Tree * Temp = tree->Left;tree->Left = Temp->Right;Temp->Right = tree;tree->Height = Max(Height(tree->Left), Height(tree->Right))+1;Temp->Height = Max(Height(Temp->Left), tree->Height) + 1;return Temp;}Tree *SingleRotateWithRight(Tree *tree){Tree * Temp = tree->Right;tree->Right = Temp->Left;Temp->Left = tree;tree->Height = Max(Height(tree->Left), Height(tree->Right)) + 1;Temp->Height = Max(Height(Temp->Left), tree->Height) + 1;return Temp;}Tree *DoubleRotateWithRight(Tree *tree){Tree*Temp = tree->Right->Left;tree->Right = SingleRotateWithLeft(tree->Right);return SingleRotateWithRight(tree);}Tree *DoubleRotateWithLeft(Tree *tree){Tree*Temp = tree->Left->Right;tree->Left = SingleRotateWithRight(tree->Left);return SingleRotateWithLeft(tree);}void Traversing(Tree*tree, int Depth){if (NULL == tree)return;for (int i = 0; i < Depth; i++)printf("   ");printf("%d\n", tree->Num);Traversing(tree->Left, Depth + 1);Traversing(tree->Right, Depth + 1);return;}int getDepthOfTree(Tree* tree){if(tree==NULL)return -1;Stack *Stack_1;Stack *Stack_2;Stack_1=(Stack*)malloc(sizeof(Stack));Stack_1->tree=NULL;Stack_1->Next=NULL;Stack_2=(Stack*)malloc(sizeof(Stack));Stack_2->tree=NULL;Stack_2->Next=NULL;Push(Stack_1,tree);int depth=0;Tree* temp=NULL;Push(Stack_1,tree);while(Stack_1->Next!=NULL){while(Stack_1->Next!=NULL){temp=Pop(Stack_1);if(temp->Left!=NULL)Push(Stack_2,temp->Left);if(temp->Right!=NULL)Push(Stack_2,temp->Right);}depth++;while(Stack_2->Next!=NULL){temp=Pop(Stack_2);Push(Stack_1,temp);}}return depth;}int main(void){Head = (Stack*)malloc(sizeof(Stack));Head->Next = NULL;Head->tree = NULL;Tree*tree = NULL;for (int i = 1; i<25; i++){tree = AVL_Insert(tree, i);}Traversing(tree,0); int depth=(getDepthOfTree(tree));printf("%d",depth);}


原创粉丝点击