把二叉樹轉變為左孩子右兄弟樹


// erchatoshu.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
//二叉樹節點結構////////////////////////
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode{
    int Element;
    SearchTree left;
    SearchTree right;
};

///左孩子右兄弟樹節點結構//////////////////
typedef struct TreeNodeforTree *Tree;
struct TreeNodeforTree {
	int Element;
	Tree LeftChild;
	Tree Brother;
};
///二叉樹到普通樹轉變函數//////////////////
Tree change(SearchTree T)
{
	///生成普通樹樹根///////////////////////
	Tree TT = (Tree)malloc(sizeof(TreeNodeforTree));
	TT->Brother = NULL;
	TT->LeftChild = NULL;
	TT->Element = T->Element;

	//二叉樹和普通樹的樹根分別人隊/////////////////
	queue<SearchTree> que;
	queue<Tree> quee;
	que.push(T);
	quee.push(TT);


	while (!que.empty())
	{
		//先檢查有沒有左孩子,有左孩子就先處理左孩子////////////////////////
		if (que.front()->left) {
			que.push(que.front()->left);
			Tree leftchild= (Tree)malloc(sizeof(TreeNodeforTree));
			leftchild->Brother = NULL;
			leftchild->LeftChild = NULL;
			leftchild->Element = que.front()->left->Element;
			quee.front()->LeftChild = leftchild;

		//再檢查有沒有右孩子,有右孩子則處理右孩子//////////////////////////////
			if (que.front()->right) {
				que.push(que.front()->right);
				Tree brother = (Tree)malloc(sizeof(TreeNodeforTree));
				brother->Element = que.front()->right->Element;
				brother->Brother = NULL;
				brother->LeftChild = NULL;
				leftchild->Brother = brother;
				quee.push(leftchild);
				quee.push(brother);
			}
		}
		//沒有左孩子有右孩子的話把父親的LeftChild指針賦值為右孩子的地址///////////////////////
		else
		{
			if (que.front()->right) {
				que.push(que.front()->right);
				Tree brother = (Tree)malloc(sizeof(TreeNodeforTree));
				brother->Element = que.front()->right->Element;
				brother->Brother = NULL;
				brother->LeftChild = NULL;
				quee.front()->LeftChild = brother;
				quee.push(brother);
			}
		}
		//循環結束彈出對應的樹節點/////////////////////////////////
		que.pop();
		quee.pop();
	}
	return TT;
}

///遞歸的二叉樹插入函數
SearchTree Insert(int x, SearchTree T)
{
	if (T == NULL) {
		T = (SearchTree)malloc(sizeof(struct TreeNode));
		if (T == NULL)
			EXIT_FAILURE;
		else
		{
			T->Element = x;
			T->left = T->right = NULL;
		}
	}
	else
	{
		if (x < T->Element)
			T->left = Insert(x, T->left);
		else if (x > T->Element)
			T->right = Insert(x, T->right);
		//否則在已在樹上什么都不做
		return T;
	}
}
///遞歸打印二叉樹/////////////////////////////////////
void printTree(SearchTree T)
{
	if (T != NULL)
	{
		cout << T->Element <<'\t';
		printTree(T->left);
		printTree(T->right);
	}
}

///打印左孩子右兄弟樹結構的函數//////////////////
void print(Tree T)               
{
	Tree left, right;
	queue<Tree> que;
	que.push(T);
	while (!que.empty())
	{
		cout << que.front()->Element<< '\t';
		left = que.front()->LeftChild;
		que.pop();
		if (left != NULL)
		{
			right = left->Brother;
			que.push(left);
			if (right != NULL)
			{
				que.push(right);
			}

		}
	}
	cout << endl;
}

int main()
{
	SearchTree T = NULL;
	for (int i = 1; i <= 14; i++)
		T=Insert(i, T);
	printTree(T);
	cout << endl;
	cout << "-------------------------------------------------------------------------------"<<endl;
	Tree TT = change(T);
	print(TT);
	while (1);
    return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM