多叉樹轉換為二叉樹演算法。演算法描述:將多叉樹的第乙個兒子結點作為二叉樹的左結點,將其兄弟結點作為二叉樹的右結點。
舉例,如下圖:
樹的結構為:
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 的值之和。節點的左子樹僅包含鍵 小於 節點鍵的節點。節點的右子樹僅包含鍵 大於 節點鍵的節點。左右子樹也必須是二叉搜...