C++ 二叉树代码

发布于:2025-03-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

二叉树代码,见下

#include <iostream>
using namespace std;

template<typename T>
struct TreeNode{
	T val;
	TreeNode *left;
	TreeNode *right;
	TreeNode():val(0), left(NULL), right(NULL)
	TreeNode(T x):val(x), left(NULL), right(NULL){}
};

template<typename T>
class Tree(){
private:
	TreeNode<T> *nodes;
	TreeNode<T> *root;
	size_t nodeSize;
	
	TreeNode<T> *Create(T a[], int size, int nodeId, T nullNode);
	void visit(TreeNode<T> *node);
	void preOrder(TreeNode<T> *node);
	void inOrder(TreeNode<T> *node);
	void postOrder(TreeNode<T> *node);
	void levelOrder(TreeNode<T> *node);
public:
	Tree();
	Tree(int maxNodes);
	~Tree();
	TreeNode<T>* GetTreeNode(int id);
	void CreateTree(T a[], int size, T nullNode);
	void preOrderTraversal();
	void inOrderTraversal();
	void postOrderTraversal();	
};

template<typename T>
Tree<T>::Tree(){
	nodeSize = 100001;
	nodes = new TreeNode<T>[nodeSize]
}

template<typename T>
Tree<T>::Tree(int maxNodes){
	nodeSize = maxNodes;
	nodes = new TreeNode<T>[nodeSize];
}

template<typename T>
TreeNode<T>* Tree<T>::GetTreeNode(int id){
	return &nodes[id];
}

template<typename T>
void Tree<T>::visit(TreeNode<T> *node){
	cout << node->val;
}

template<typename T>
void Tree<T>::preOrder(TreeNode<T> *node){
	if(node){
		visit(node);
		preOrder(node->left);
		preOrder(node->right);
	}
}

template<typename T>
void Tree<T>::inOrder(TreeNode<T> *node){
	if(node){
		inOrder(node->left);
		visit(node);
		inOrder(node->right);
	}
}


template<typename T>
void Tree<T>::postOrder(TreeNode<T> *node){
	if(node){
		postOrder(node->left);
		postOrder(node->right);
		visit(node);
	}
}

template<typename T>
void Tree<T>::CreatTree(T a[], int size, T nullnode){
	root = Create(a, size, 1, nullnode);
}

template<typename T>
TreeNode<T>* Tree<T>::Create(T a[], int size, int nodeId, T nullnode){
	if(nodeId >= size || a[nodeId] == nullnode){
		return NULL;
	}
	TreeNode<T> *nowNode = GetTreeNode(nodeId);
	nowNode->val = a[nodeId];
	nowNode->left = Create(a, size, nodeId*2, nullnode);
	nowNode->right = Create(a, size, nodeId*2+1, nullnode);
	return nownode;	
}

template<typename T>
void Tree<T>::preOrderTraversal(){
	preOrder(root);
}

template<typename T>
void Tree<T>::inOrderTraversal(){
	inOrder(root);
}

template<typename T>
void Tree<T>::postOrderTraversal(){
	postOrder(root);
}
int main()
{
   cout << "Hello World";
   return 0;
}

二叉树代码,对应力扣,完全二叉树的节点个数

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root == NULL){
            return 0;
        }
        int lc = countNodes(root->left);
        int rc = countNodes(root->right);

        return lc + rc + 1;
    }
};

代码练习,对应力扣单值二叉树,代码见下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isUnivalTree(TreeNode* root) {
        if(root == NULL){
            return true;
        }
        if(root->left){
            if(root->val != root->left->val){
                return false;
            }
            if(!isUnivalTree(root->left)){
                return false;
            }
        }
        if(root->right){
            if(root->val != root->right->val){
                return false;
            }
            if(!isUnivalTree(root->right)){
                return false;
            }
        }
        return true;
    }
};

代码四,对应力扣 二叉树的前序遍历,代码见下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> ret;
    void preorder(TreeNode *root){
        if(root){
            ret.push_back(root->val);
            preorder(root->left);
            preorder(root->right);
        }
    }
    vector<int> preorderTraversal(TreeNode* root) {
        ret.clear();
        preorder(root);
        return ret;
    }
};

代码五,对应力扣,二叉树的中序遍历,代码见下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> ret;
    void inorder(TreeNode *root){
        if(root){
            inorder(root->left);
            ret.push_back(root->val);
            inorder(root->right);
        }
    }
    vector<int> inorderTraversal(TreeNode* root) {
        ret.clear();
        inorder(root);
        return ret;
    }
};

代码六,对应力扣,二叉树的后续遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    vector<int> ret;
    void postorder(TreeNode *root){
        if(root){
        postorder(root->left);
        postorder(root->right);
        ret.push_back(root->val);
        }
    }
public:
    vector<int> postorderTraversal(TreeNode* root) {
        ret.clear();
        postorder(root);
        return ret;
    }
};

代码,对应力扣,翻转二叉树,代码见下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == NULL){
            return NULL;
        }
        TreeNode* l = invertTree(root->left);
        TreeNode* r = invertTree(root->right);

        root->left = r;
        root->right = l;
        return root;
    }
};