void connect(struct TreeNode* root) { if (root == NULL) { return; } struct myListNode *queue = malloc(sizeof(struct myListNode)); queue->val = root; queue->next = NULL; levelOrderTraverse(&queue, 0); }
void levelOrderTraverse(struct myListNode **queue, int rowIndex) { // This solution works for both versions of this problem, so I just pasted it struct myListNode *toBeProcessedHead = NULL; struct myListNode *toBeProcessed = malloc(sizeof(struct myListNode)); toBeProcessedHead = toBeProcessed; toBeProcessed->val = NULL; toBeProcessed->next = NULL; int processed = 0; for (struct myListNode *node = *queue; node != NULL; node = *queue) { *queue = node->next; if (node->val == NULL) { continue; } processed++; if (toBeProcessed->val == NULL) { toBeProcessed = node; toBeProcessed->next = NULL; toBeProcessedHead = node; } else { toBeProcessed->next = node; toBeProcessed = node; toBeProcessed->next = NULL; } } if (processed == 0) { return; } processed = 0; struct myListNode *queueHead = NULL; struct myListNode *queueCurrent = NULL; struct TreeLinkNode *lastNode = NULL; for (struct myListNode *node = toBeProcessedHead; node != NULL; ) { if (node->val == NULL) { struct myListNode *next = node->next; node = next; continue; } processed++; if (lastNode == NULL) { lastNode = node->val; } else { lastNode->next = node->val; lastNode = node->val; } struct myListNode *next = node->next; struct myListNode *leftChild = malloc(sizeof(struct myListNode)); leftChild->val = node->val->left; leftChild->next = NULL; struct myListNode *rightChild = malloc(sizeof(struct myListNode)); rightChild->val = node->val->right; rightChild->next = NULL; if (queueHead == NULL) { queueHead = leftChild; queueHead->next = rightChild; queueCurrent = rightChild; } else { queueCurrent->next = leftChild; leftChild->next = rightChild; queueCurrent = rightChild; } node = next; } if (processed == 0) { return; } lastNode->next = NULL; levelOrderTraverse(&queueHead, rowIndex + 1); }
void main(){ int i; BiTreeLink T,p,c; TElemType e1,e2; initBiTree(&T); //判断数是否为空,求树的深度 printf("\nInit a Binary Tree!\nThe tree is empty or not?%d(1:yes 0:no);The tree depth=%d\n",biTreeEmpty(T),biTreeDepth(T)); //寻找根结点 e1 = root(T); if(e1!=Nil) printf("\nThe root of the Binary Tree is:'%c'\n",e1); else printf("\nThe Binary Tres has no root\n"); //请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树) printf("\nBuild a Binary Tree!like abc@@de@g@@f@@hi@j@@k@@,@stand for space\n"); createBiTree(&T); //判断数是否为空,求树的深度 printf("\nThe tree is empty or not?%d(1:yes 0:no);The tree depth=%d\n",biTreeEmpty(T),biTreeDepth(T)); //寻找根结点 e1 = root(T); if(e1!=Nil) printf("\nThe root of the Binary Tree is:'%c'\n",e1); else printf("\nThe Binary Tres has no root\n"); //层序递归遍历(Of sequence to traverse the binary tree) printf("\nlevel order Traverse the Binary Tree:\n"); levelOrderTraverse(T,visitT); //先序遍历 printf("\npreOrder Traverse the Binary Tree:\n"); preOrderTraverse(T,visitT); //中序递归遍历 printf("\n\ninOrder recursion Traverse the Binary Tree:\n"); inOrderTraverse(T,visitT); //中序非递归遍历1 printf("\ninOrder non-recursion Traverse the Binary Tree 1:\n"); inOrderTraverse1(T,visitT); //中序非递归遍历2 printf("inOrder non-recursion Traverse the Binary Tree 2:\n"); inOrderTraverse2(T,visitT); //后序递归遍历 printf("\npostOrder recursion Traverse the Binary Tree:\n"); postOrderTraverse(T,visitT); //修改结点 e1 = 'd';//原值 //scanf("%c",&e1); p = point(T,e1);//获得e1对应的指针 //获得对应结点的值 printf("\n\nKnow the previous vaule is:'%c'\nEnter the new vlaue:\n",value(p)); e2 = 'r';//新结点的值 //scanf("%c",&e2); assign(p,e2);//赋新值 //先序遍历 printf("preOrder Traverse the Binary Tree:\n"); preOrderTraverse(T,visitT); //寻找双亲 e1 = parent(T,e2); if(e1!=Nil) printf("\n\nthe parent of '%c' is : '%c'\n",e2,e1); else printf("'%c' has no parent\n",e2); //寻找左孩子 e1 = leftChild(T,e2); if(e1!=Nil) printf("\nthe left child of '%c' is : '%c'\n",e2,e1); else printf("'%c' has no left child\n",e2); //寻找右孩子 e1 = rightChild(T,e2); if(e1!=Nil) printf("\nthe right child of '%c' is : '%c'\n",e2,e1); else printf("'%c' has no right child\n",e2); //寻找左兄弟 e1 = leftSibling(T,e2); if(e1!=Nil) printf("\nthe left sibling of '%c' is : '%c'\n",e2,e1); else printf("'%c' has no left sibling\n",e2); //寻找右兄弟 e1 = rightSibling(T,e2); if(e1!=Nil) printf("\nthe right sibiling of '%c' is : '%c'\n",e2,e1); else printf("'%c' has no right sibiling\n",e2); //初始化需要插入的树 initBiTree(&c);//s=jk //这里有三个空格 printf("\nBuild the Binary Tree c which has no right child:\n"); c = (BiTreeLink)malloc(sizeof(BiTNode)); p = (BiTreeLink)malloc(sizeof(BiTNode)); c->lchild = p; c->rchild = NULL; c->data = 'm'; p->lchild = p->rchild = NULL; p->data = 'n'; //createBiTree(&c); //先序递归遍历 printf("\npreOrder Traverse the Binary Tree:\n"); preOrderTraverse(c,visitT); //树s插到树T中,请输入树T中树s的双亲结点 s为左(0)或右(1)子树: printf("\n\nInsert the Tree s to the Tree T,enter the parent of the Tree c in the Tree T,left Tree(0) and right Tree(1):\n"); e1= 'b';i = 0;//将子树c作为结点'b'的左子树 //scanf("%c%d",&e1,&i); p = point(T,e1);//p是T中树c的双亲结点指针 insertChild(p,i,c); //先序递归遍历 printf("\npreOrder Traverse the Binary Tree:\n"); preOrderTraverse(T,visitT); // 删除子树,请输入待删除子树根结点 左(0)或右(1)子树 printf("\n\nDelete the Tree s,enter the root of the deleting Child Tree, left Tree(0) and right Tree(1):\n"); e1= 'b';i = 1;//删除父结点为'b'的右子树 p = point(T,e1);//p是T中树c的双亲结点指针 deleteChild(p,i); //先序递归遍历 printf("\npreOrder Traverse the Binary Tree:\n"); preOrderTraverse(T,visitT); //清空子树 clearBiTree(&T); printf("\n\nEmpty the Binary Tree?%d(1:yes 0:no)\nThe tree depth=%d\n",biTreeEmpty(T),biTreeDepth(T)); //寻找根结点 e1 = root(T); if(e1!=Nil) printf("\nThe root of the Binary Tree is:'%c'\n",e1); else printf("\nThe Binary Tres has no root\n"); }