树的排序算法 前序 中序 后序

树节点 保存结点值,左子树,右子树

public class TreeNode {
    private String value;
    private  TreeNode left;
    private  TreeNode right;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public TreeNode getLeft() {
        return left;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public TreeNode getRight() {
        return right;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }

    public TreeNode(String value, TreeNode left, TreeNode right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "value='" + value + '\'' +
                ", left=" + left +
                ", right=" + right +
                '}';
    }
}

初始化一个树形状为
在这里插入图片描述
前序 中序 后序排序算法

public class Tree {
    private TreeNode root;
    private List<TreeNode> result=new ArrayList<TreeNode>();

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public List<TreeNode> getResult() {
        return result;
    }

    public void setResult(List<TreeNode> result) {
        this.result = result;
    }
    public Tree(){
        init();
    }

    private void init() {
        TreeNode g=new TreeNode("G",null,null);
        TreeNode x=new TreeNode("X",null,null);
        TreeNode y=new TreeNode("Y",null,null);
        TreeNode d=new TreeNode("D",x,y);
        TreeNode b=new TreeNode("B",d,null);
        TreeNode e=new TreeNode("E",g,null);
        TreeNode f=new TreeNode("F",null,null);
        TreeNode c=new TreeNode("C",e,f);
        TreeNode a=new TreeNode("A",b,c);
        root=a;
    }

    /**
     * 计算深度
     * @param node
     * @return
     */
    public int calDepth(TreeNode node){
        if (node.getLeft()==null&&node.getRight()==null){
            return 1;
        }
        int leftDepth=0;
        int rightDepth=0;
        if(node.getLeft()!=null){
            leftDepth=calDepth(node.getLeft());
        }
        if(node.getRight()!=null){
            rightDepth=calDepth(node.getRight());
        }
        System.out.println("左"+leftDepth+"右"+rightDepth);
        int temp=leftDepth>rightDepth?leftDepth+1:rightDepth+1;
        System.out.println("中间计算结果"+temp);
        return temp;
    }
    //前序遍历  根左右
    public void perOrder(TreeNode root){
        if(root==null){
            return;
        }
        result.add(root);
        if(root.getLeft()!=null){
            perOrder(root.getLeft());
        }
        if(root.getRight()!=null){
            perOrder(root.getRight());
        }
    }
    //中序遍历   左根右
    public void InMiddleOrder(TreeNode root){
        if(root==null){
            return;
        }
        if(root.getLeft()!=null){
            InMiddleOrder(root.getLeft());
        }
        result.add(root);
        if(root.getRight()!=null){
            InMiddleOrder(root.getRight());
        }
    }
    //后序遍历   左右根
    public void LastOrder(TreeNode root){
        if(root==null){
            return;
        }
        if(root.getLeft()!=null){
            LastOrder(root.getLeft());
        }
        if(root.getRight()!=null){
            LastOrder(root.getRight());
        }
        result.add(root);
    }





}

测试程序

public class SearchTree {
    public static void main(String[] args) {
        Tree tree=new Tree();
        System.out.println("根节点"+tree.getRoot().getValue());
        //先序遍历
        tree.perOrder(tree.getRoot());
        System.out.println("树的深度是"+tree.calDepth(tree.getRoot()));
        System.out.println("先序遍历结果是:");
        for (TreeNode eNode  :tree.getResult() ) {
            System.out.print(eNode.getValue()+" ");
        }
        tree.getResult().clear();
        tree.InMiddleOrder(tree.getRoot());
        System.out.println("中序遍历结果是:");
        for (TreeNode eNode  :tree.getResult() ) {
            System.out.print(eNode.getValue()+" ");
        }
        tree.getResult().clear();
        tree.LastOrder(tree.getRoot());
        System.out.println("后序遍历结果是:");
        for (TreeNode eNode  :tree.getResult() ) {
            System.out.print(eNode.getValue()+" ");
        }

    }


}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 插入新节点 ```c++ struct TreeNode { int val; int height; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), height(1), left(nullptr), right(nullptr) {} }; // 获取节点高度 int getHeight(TreeNode* root) { if (root == nullptr) return 0; return root->height; } // 获取节点平衡因子 int getBalanceFactor(TreeNode* root) { if (root == nullptr) return 0; return getHeight(root->left) - getHeight(root->right); } // 更新节点高度 void updateHeight(TreeNode* root) { root->height = max(getHeight(root->left), getHeight(root->right)) + 1; } // 左旋 TreeNode* leftRotate(TreeNode* root) { TreeNode* newRoot = root->right; root->right = newRoot->left; newRoot->left = root; updateHeight(root); updateHeight(newRoot); return newRoot; } // 右旋 TreeNode* rightRotate(TreeNode* root) { TreeNode* newRoot = root->left; root->left = newRoot->right; newRoot->right = root; updateHeight(root); updateHeight(newRoot); return newRoot; } // 插入节点 TreeNode* insert(TreeNode* root, int val) { if (root == nullptr) { return new TreeNode(val); } if (val < root->val) { root->left = insert(root->left, val); } else if (val > root->val) { root->right = insert(root->right, val); } else { return root; } updateHeight(root); int balanceFactor = getBalanceFactor(root); if (balanceFactor > 1 && getBalanceFactor(root->left) >= 0) { return rightRotate(root); } if (balanceFactor > 1 && getBalanceFactor(root->left) < 0) { root->left = leftRotate(root->left); return rightRotate(root); } if (balanceFactor < -1 && getBalanceFactor(root->right) <= 0) { return leftRotate(root); } if (balanceFactor < -1 && getBalanceFactor(root->right) > 0) { root->right = rightRotate(root->right); return leftRotate(root); } return root; } ``` 2. 遍历二叉(递归) ```c++ void preOrder(TreeNode* root) { if (root == nullptr) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } ``` 3. 遍历二叉(递归) ```c++ void inOrder(TreeNode* root) { if (root == nullptr) return; inOrder(root->left); cout << root->val << " "; inOrder(root->right); } ``` 4. 后遍历二叉(递归) ```c++ void postOrder(TreeNode* root) { if (root == nullptr) return; postOrder(root->left); postOrder(root->right); cout << root->val << " "; } ``` 5. 遍历二叉(非递归) ```c++ void preOrder2(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> st; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); cout << node->val << " "; if (node->right) st.push(node->right); if (node->left) st.push(node->left); } } ``` 6. 遍历二叉(非递归) ```c++ void inOrder2(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> st; TreeNode* node = root; while (node || !st.empty()) { while (node) { st.push(node); node = node->left; } node = st.top(); st.pop(); cout << node->val << " "; node = node->right; } } ``` 7. 后遍历二叉(非递归) ```c++ void postOrder2(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> st; TreeNode* prev = nullptr; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); if ((!node->left && !node->right) || (prev && (prev == node->left || prev == node->right))) { cout << node->val << " "; st.pop(); prev = node; } else { if (node->right) st.push(node->right); if (node->left) st.push(node->left); } } } ``` 8. 层次遍历二叉 ```c++ void levelOrder(TreeNode* root) { if (root == nullptr) return; queue<TreeNode*> q; q.push(root); while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; i++) { TreeNode* node = q.front(); q.pop(); cout << node->val << " "; if (node->left) q.push(node->left); if (node->right) q.push(node->right); } } } ``` 9. 在二叉查找给定关键字 ```c++ bool search(TreeNode* root, int val) { if (root == nullptr) return false; if (root->val == val) return true; if (val < root->val) return search(root->left, val); return search(root->right, val); } ``` 10. 交换各结点的左右子 ```c++ void swapLeftRight(TreeNode* root) { if (root == nullptr) return; swap(root->left, root->right); swapLeftRight(root->left); swapLeftRight(root->right); } ``` 11. 求二叉的深度 ```c++ int getDepth(TreeNode* root) { if (root == nullptr) return 0; return max(getDepth(root->left), getDepth(root->right)) + 1; } ``` 12. 叶子结点数 ```c++ int getLeafCount(TreeNode* root) { if (root == nullptr) return 0; if (root->left == nullptr && root->right == nullptr) return 1; return getLeafCount(root->left) + getLeafCount(root->right); } ``` 13. 删除某结点 ```c++ TreeNode* deleteNode(TreeNode* root, int val) { if (root == nullptr) return nullptr; if (val < root->val) { root->left = deleteNode(root->left, val); } else if (val > root->val) { root->right = deleteNode(root->right, val); } else { if (root->left == nullptr || root->right == nullptr) { TreeNode* tmp = root->left ? root->left : root->right; delete root; root = tmp; } else { TreeNode* tmp = root->right; while (tmp->left) tmp = tmp->left; root->val = tmp->val; root->right = deleteNode(root->right, tmp->val); } } if (root == nullptr) return nullptr; updateHeight(root); int balanceFactor = getBalanceFactor(root); if (balanceFactor > 1 && getBalanceFactor(root->left) >= 0) { return rightRotate(root); } if (balanceFactor > 1 && getBalanceFactor(root->left) < 0) { root->left = leftRotate(root->left); return rightRotate(root); } if (balanceFactor < -1 && getBalanceFactor(root->right) <= 0) { return leftRotate(root); } if (balanceFactor < -1 && getBalanceFactor(root->right) > 0) { root->right = rightRotate(root->right); return leftRotate(root); } return root; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值