二叉树学习笔记

 1、链表实现二叉树

// 树节点类
class Bitreenode {
    char data;
    Bitreenode* ls, * rs, * fa;  // ls为左儿子节点,rs为右儿子节点,fa为父节点
public:
    Bitreenode() {
        data = '0';
        ls = rs = fa = nullptr;
    }
    void set_ls(Bitreenode *p) {
        ls = p;
    }
    void set_rs(Bitreenode* p) {
        rs = p;
    }
    void set_data(char d) {
        data = d;
    }
    void set_fa(Bitreenode* p) {
        fa = p;
    }
    char get_data() {
        return data;
    }
    Bitreenode* get_ls() {
        return ls;
    }
    Bitreenode*  get_rs() {
        return rs;
    }
    Bitreenode* get_fa() {
        return fa;
    }
};

string s;  
int pos;
char son[100];
char fa[100];

class Bitree {
    Bitreenode* root;
    int num;
    int cnt;
    int h;
public:

    // 建树前初始化工作
    void Creat() {
        pos = 0;
        num = 0;
        cnt = 0;
        h = 0;
        root = creat_tree(nullptr, 0);
    }
    
    // 建树方法采用“先序遍历+空树用0表示”的方法
    Bitreenode* creat_tree(Bitreenode * fa, int height) {
        Bitreenode* cn;
        if (pos >= s.size()) {
            return nullptr;
        }
        char ch = s[pos];
        if (ch == '0') {
            pos++;
            cn = nullptr;
        }
        else {
            height++;
            h = max(h, height);
            cn = new Bitreenode;
            cn->set_data(ch);
            cn->set_fa(fa);
            num++;
            pos++;
            cn->set_ls(creat_tree(cn, height));
            cn->set_rs(creat_tree(cn, height));
        }
        return cn;
    }

    // 前序遍历
    void preOrder(Bitreenode *p) {
        if (p != nullptr) {
            cout << p->get_data();
            preOrder(p->get_ls());
            preOrder(p->get_rs());
        }
    }

    // 中序遍历
    void inOrder(Bitreenode* p) {
        if (p != nullptr) {
            inOrder(p->get_ls());
            cout << p->get_data();
            inOrder(p->get_rs());
        }
    }

    // 后序遍历
    void posOrder(Bitreenode* p) {
        if (p != nullptr) {
            posOrder(p->get_ls());
            posOrder(p->get_rs());
            cout << p->get_data();
        }
    }

    // 计算叶节点数
    int get_sonnode(Bitreenode *p) {
        if (p != nullptr) {
            if (p->get_ls() == nullptr && p->get_rs() == nullptr) {
                son[cnt] = p->get_data();
                fa[cnt] = p->get_fa()->get_data();
                cnt++;
            }
            else {
                get_sonnode(p->get_ls());
                get_sonnode(p->get_rs());
            }
        }
        return cnt;
    }

    // 层序遍历
    void levelOrder(Bitreenode* p) {
        queue q;
        if (p == nullptr) {
            return;
        }
        q.push(p);
        while (q.empty() != 1) {
            p = q.front();
            q.pop();
            cout << p->get_data();
            if (p->get_ls() != nullptr) {
                q.push(p->get_ls());
            }
            if (p->get_rs() != nullptr) {
                q.push(p->get_rs());
            }
            
        }
    }
    
    // 返回根节点
    Bitreenode* get_root() {
        return root;
    }

    // 返回树的深度
    int get_h() {
        return h;
    }
};

2、数组实现二叉树

二叉树学习笔记_第1张图片

#include 
#include 
#include 
#include 
#include
using namespace std;

struct Bitree {
	int data;
	int ls;
	int rs;
};

void preOrder(Bitree * p, int n, int pos) {
	if(p[pos].data != 0) {
		cout << p[pos].data << " ";
		if(p[pos].ls != -1)preOrder(p, n, p[pos].ls);
		if(p[pos].rs != -1)preOrder(p, n, p[pos].rs);
	}
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		Bitree* p = new Bitree[n + 1];
		for (int i = 1; i <= n; i++) {
			cin >> p[i].data;
			if (2 * i <= n) {
				p[i].ls = 2 * i;
			}
			else p[i].ls = -1;

			if (2 * i + 1 <= n) {
				p[i].rs = 2 * i + 1;
			}
			else p[i].rs = -1;
		}
		preOrder(p, n, 1);
		cout << endl;
	}
	return 0;
}

你可能感兴趣的:(数据结构,学习,笔记,c++)