#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
#define SElementType BinaryTreeNode*
struct BinaryTreeNode {
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
struct Stack {
SElementType* base;
int top;
int stack_length;
};
Stack* InitStack() {
Stack* stack= (Stack*) malloc(sizeof(Stack));
stack->base = (SElementType*) malloc(10 * sizeof(SElementType));
stack->top = 0;
stack->stack_length = 10;
return stack;
}
void Push (Stack* stack, SElementType element) {
stack->base[stack->top] = element;
stack->top++;
}
SElementType Pop(Stack* stack) {
stack->top--;
SElementType element = stack->base[stack->top];
return element;
}
bool Empty(Stack* stack) {
return 0 == stack->top;
}
void Print (BinaryTreeNode* pHead) {
if (NULL == pHead) {
return;
}
Print(pHead->m_pLeft);
printf("%d ", pHead->m_nValue);
Print(pHead->m_pRight);
}
void PrintList(BinaryTreeNode* lHead) {
if (NULL == lHead) {
return;
}
BinaryTreeNode* pNode = lHead;
BinaryTreeNode* pTail;
while (pNode) {
printf("%d ", pNode->m_nValue);
pTail = pNode;
pNode = pNode->m_pLeft;
}
printf("\n");
printf("Rever is:\n");
while (pTail) {
printf("%d ", pTail->m_nValue);
pTail = pTail->m_pRight;
}
printf("\n");
}
void Convert(BinaryTreeNode* pHead) {
if (NULL == pHead) {
return;
}
Stack* stack = InitStack();
BinaryTreeNode* pNode = pHead;
BinaryTreeNode* listHead;
Push(stack, pNode);
pNode = pNode->m_pLeft;
BinaryTreeNode* lHead = NULL;
BinaryTreeNode* lNode = NULL;
while (!Empty(stack)) {
while(pNode) {
Push(stack,pNode);
pNode = pNode->m_pLeft;
}
pNode = Pop(stack);
if (NULL == lHead) {
lHead = pNode;
lNode = pNode;
pNode = pNode->m_pRight;
}
else {
lNode->m_pLeft = pNode;
pNode = pNode->m_pRight;
lNode->m_pLeft->m_pRight = lNode;
lNode = lNode->m_pLeft;
}
while (pNode) {
Push(stack, pNode);
pNode = pNode->m_pLeft;
}
}
PrintList(lHead);
}
void Initial(BinaryTreeNode* pHead, int leftValue, int rightValue) {
BinaryTreeNode* pLeft = (BinaryTreeNode*) malloc(sizeof(BinaryTreeNode));
BinaryTreeNode* pRight = (BinaryTreeNode*) malloc(sizeof(BinaryTreeNode));
pLeft->m_nValue = leftValue;
pRight->m_nValue = rightValue;
pHead->m_pLeft = pLeft;
pHead->m_pRight = pRight;
}
BinaryTreeNode* Init() {
BinaryTreeNode* pHead = (BinaryTreeNode*) malloc(sizeof(BinaryTreeNode));
pHead->m_nValue = 4;
Initial(pHead, 2,6);
Initial(pHead->m_pLeft, 1,3);
Initial(pHead->m_pRight, 5,7);
return pHead;
}
int main() {
BinaryTreeNode* pHead = Init();
printf("Original Sorted Binary Tree:\n");
Print(pHead);
printf("\n");
printf("Converted Double Linked List:\n");
Convert(pHead);
return 0;
}
排序二叉树转为双向列表
最新推荐文章于 2022-07-06 11:23:39 发布