多叉樹 轉換為二叉樹 演算法

2021-06-25 21:21:32 字數 3116 閱讀 4039

多叉樹轉換為二叉樹演算法。演算法描述:將多叉樹的第乙個兒子結點作為二叉樹的左結點,將其兄弟結點作為二叉樹的右結點。

舉例,如下圖:

樹的結構為:

typedef struct binarytreenode{

struct binarytreenode* leftchild;

struct binarytreenode* rightchild;

int value;

typedef struct treenode{

struct treenode* child;

int child_count;

int value;

binarytreenode* tobinarytree(treenode*root){

if(root == null) return null;

binarytreenode* binaryroot = new binarytreenode();

binaryroot->leftchild = binaryroot->rightchild = null;//注意初始化

binaryroot->value = root->value;

binaryroot->leftchild = tobinarytree(root->child[0]);

binarytreenode* brother = binaryroot->leftchild;

for(int i = 1; i < root->child_count;i++){

brother->rightchild = tobinarytree(root->child[i]);

brother = brother->rightchild;

return binaryroot;

樹採用的儲存結構見表一,轉化為二叉樹見表二,之後再將表轉化為二叉鍊錶的儲存方式,程式及相應測試見**:

data

parent0a

-11b0

2c03

d04e

15f1

6g3

data

parent

leftchild

rightchild0a

-1101

b042

2c00

33d0

604e

1055

f100

6g30

0 表一                              表二

#include

#include

using namespace std;

struct node    // 以表的形式儲存的樹結點

chardata;

intparent;   

intlchild;

intrchild;

struct treenode // 以二叉鍊錶儲存的樹結點

chardata;

treenode*l;

treenode*r;

// 建立樹的表並轉化為二叉樹

int creattable(node table)

intn, k, i, j;

cout<< "輸入結點個數(<20):";

cin>> n;

if(n > 0)

cout << "輸入結點資訊和雙親編號(第乙個請輸入根結點資訊如a-1 ):" << endl;

for (i = 0; i < n; i++)

cin >> table[i].data >> table[i].parent;

table[i].lchild = table[i].rchild = 0;

for (i = 0; i < n; i++)

for (j = 1; j < n; j++)

if (table[j].parent == i)

if (table[i].lchild == 0)

table[i].lchild = j;

k = j;

else

table[k].rchild = j;

k = j;

for (i = 0; i < n; i++)

cout << table[i].data << table[i].parent

// 將表轉化為二叉鍊錶

void build(treenode *¤t, nodenode, int pos, int n)

if(n > 0)

if (current == 0)

current = new treenode;

current->l = current->r = 0;

current->data = node[pos].data;

if (node[pos].lchild)

build(current->l, node, node[pos].lchild, n);

if (node[pos].rchild)

build(current->r, node, node[pos].rchild, n);

// 訪問結點

void visit(treenode *current)

cout

// 按先序遍歷

void preorder(treenode *root)

treenode *current = root;

if(current != 0)

visit(current);

preorder(current->l);

preorder(current->r);

int main()

nodenode[20];

intn = creattable(node);

treenode*root = 0;

build(root,node, 0, n);

if(root)

cout << "先序遍歷:";

preorder(root);

cout << endl;

else

cout << "空樹!" << endl;

return0;

樹轉換為二叉樹

輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 n n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的兒子序列,以0結束。若ai後僅含乙個...

樹轉二叉樹(有序樹轉換為二叉樹)講解

description 輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。input 包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 i n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的...

把二叉樹轉換為累加樹

題目鏈結 給出二叉 搜尋 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹 greater sum tree 使每個節點 node 的新值等於原樹中大於或等於 node.val 的值之和。節點的左子樹僅包含鍵 小於 節點鍵的節點。節點的右子樹僅包含鍵 大於 節點鍵的節點。左右子樹也必須是二叉搜...